Jihoon's IT Development

Web Developer's Hobby Development Notes

Burp suite 간단사용법

프록시 서버 설정

프록시서버

서버와 클라이언트 사이에서 중계기 역할을 수행하며 대리로 통신하는 기능을 프록시(Proxy) 라고 합니다. 프록시 서버란 해당 중계기능을 지원하고 있는 서버(컴퓨터) 혹은 응용프로그램 을 말합니다.

Burp Suite 사용을 위해서는 우선 프록시 서버를 설정할 필요가 있습니다.

이번 포스팅에서는 Windows 10 / Chrome 환경에서 프록시 서버를 생성해보겠습니다.

  • Chrome의 설정 화면을 열어줍니다.

  • 고급 설정 하단의 프록시 설정 열기 를 클릭해줍니다.

  • 인터넷 속성에서 LAN 설정을 클릭합니다.
  • 프록시 서버 란에 체크한 뒤 로컬 서버 ip 인 127.0.0.1 을 넣어주고, Burp Suite 의 기본 포트인 8080 을 설정해줍니다.
  • 프록시 서버 설정이 완료되었습니다.

Burp Suite Proxy 확인

Burp Suite 프로그램의 설치는 이전 포스트를 참고해주세요.

  • 프록시 서버 설정을 완료한 뒤 Burp Suite 프로그램을 실행합니다.
  • proxy 탭에서 Intercept is off 를 클릭하여 Intercept is on 으로 변경합니다.
  • on 인 동안에는 Chrome 을 통한 브라우징이 모두 Burp Suite 를 통해야만 진행될 수 있게됩니다.
  • 필요에 따라 On / Off 하면서 사용하면 됩니다.

주의 : Chrome 자체적으로 위험한 Proxy 를 감시하는 기능이 존재합니다. 외부 인터넷 연경 (Google 검색 등)에 제한이 있을 수 있습니다.

주요 옵션

proxy

패킷을 의도한 대상에 도달 하지 않게 하거나 특정 호스트에 redirect 하거나, 패킷을 삭제할 수도 있습니다.

spider

spider 기능은 새 링크, 콘텐츠 등을 찾는 데 사용 됩니다. 로그인 폼을 찾으면 자동으로 전송하고, response를 통해 새로운 contents를 찾습니다. 이 정보는 scanner 로 보내져서, 찾아낸 모든 link와 content에 대해 scan을 하게 됩니다.

scanner

웹 응용 프로그램을 scan하여 취약점을 찾는데 사용 됩니다. 검사의 종류는 passive, active, user-directed가 있습니다. 몇 가지 false positives가 테스트 하는 동안 발생할 수 있습니다. 자동화된 스캐너에는 100% 정확한 결과가 없음을 기억하는 게 중요합니다. 불행하게도 무료 버전으로는 scanner 기능이 제공되지 않습니다.

intruder

이 기능은 브루트 포스 공격을 수행하거나 웹 응용 프로그램을 fuzzing하거나, 취약점을 exploite하는 것과 같은 다양한 목적을 위해 사용할 수 있습니다.

repeater

이 기능은 같은 요청을 많은 횟수로 수정해서 보내서, 응답을 분석할 때 사용 됩니다.

sequencer

이 기능은 주로 웹 응용 프로그램에서 제공 하는 세션 토큰의 임의성을 확인 할 때 사용 됩니다. 이것을 알아내기 위해 다양한 고급 테스트를 수행 합니다.

decoder

이 기능을 사용하여 암호화된 데이터를 다시 원래 형태로 해독하거나, 데이터를 암호화 하기 위하여 사용할 수 있습니다.

comparer

이 기능은 두 개의 요청, 응답 또는 다른 형태의 데이터 비교를 수행하는 데 사용됩니다. 이 기능은 다른 입력에 대한 응답을 비교 하는 경우에 유용할 수 있습니다.

Burp suite 설치

Burp Suite 란

Burp or Burp Suite is a graphical tool for testing Web application security. The tool is written in Java and developed by PortSwigger Security.

Burp Suite는 웹 애플리케이션의 보안 테스트를 돕기위한 그래픽 툴 입니다. 다양한 기능을 제공하지만 유료인 Pro 버전이 존재하며 수동으로 테스트 해볼 수 있게 나온 Community 버전이 존대합니다.
Pro를 구매할 이유가 없는 관계료 오늘 살펴볼 버전은 Community 버전입니다.
주의 : Community 버전은 프로젝트를 저장할 수 없습니다. 두고두고 테스트를 진행해야 한다면 좋은 선택이 아닐 수 있습니다.

Burp_suite 다운로드 및 설치

다운로드 경로 : https://portswigger.net/burp/communitydownload

java 기반으로 제작된 jar 버전이 있으며, windows 일 경우 exe 버전을 다운로드 받아 install 할 수도 있습니다. 원하는 버전을 다운로드 합니다.
글에서는 windows 버전을 기준으로 설치하겠습니다.

다운로드가 완료되었다면 burpsuite_community_windows-x64_v1_7_36.exe 와 유사한 파일이 저장됩니다. 더블클릭 합니다.
관리자 권한이 필요합니다.

windows 버전은 설치가 간단합니다. (사실 java 버전은 설치조차 필요 없을 수도 있겠지만요…)

좋은설치 = 넥스트 고고!

Burp Suite 실행

시작메뉴에 생성된 Burp Shute 를 실행합니다.

잠시간의 로딩 후 아래의 화면을 만나게 됩니다.

프로젝트 정보 등을 저장할 수 없는 임시 프로젝트만 지원한다는 이야기 입니다. 아쉽지만 다음 화면으로 갑시다. Community 버전의 한계

첫 실행이므로 별다른 설정이 존재할리 없습니다. default 설정을 선택하고 다음 화면으로 갑니다.

성공적으로 첫 실행화면이 출력되었습니다.

다음 시간에는 Tool 을 이용한 간단한 XSS 테스트를 진행해보겠습니다.

Selenium을 이용한 Web Crawler 만들기

Selenium 이란?

Selenium automates browsers.

Selenium은 webdriver를 통해 웹 브라우저(ie, chrome, firefox 등)를 자동화 하여 웹 에플리케이션을 테스트 할 수 있는 오픈소스 프레임워크입니다.
다양한 언어 (c#, java, python) 를 지원하며, 상황에 맞게 골라 사용할 수 있죠.

Selenium에는 Selenium WebDriverSelenium IDE 가 있습니다.

Selenium WebDriver

Selenium WebDriver는 지금은 사용되지 않는 Selenium Remote Control의 후속제품으로 다음과 같은 기능이 필요할 경우 사용이 추천됩니다.

  • 브라우저 기반의 강력한 반복 자동화 테스트 생성
  • 여러 환경에서 Script를 확장 및 배포

Selenium IDE

Selenium IDE는 Firefox 의 확장프로그램(add-on)으로 간단히 recodeplayback을 사용할 수 있습니다.
다음과 같은 기능이 있을 경우 사용이 추천됩니다.

  • 빠른 버그 복제 스크립트 작성
  • 자동화 된 예비 검사를 돕기위한 스크립트 작성

이번에 제작하려는 프로그램은 Web Crawler이기 때문에 IDE 는 다음기회에 살펴보기로 하고 Selenium WebDriver를 살펴보기로 합니다.


Selenium + python

Selenium은 많은 언어를 지원하지만 python 을 기반으로 살펴보겠습니다.
간단한 프로젝트를 만들때 python 을 사용하는 이유는 다음과 같습니다.

  • 비교적 짧은 코드로 얻을 수 있는 만족스러운 결과물
  • 복잡하지 않은 작은 규모의 Application 을 제작하기에 적합
  • 파워풀한 Beautifulsoup
  • jar 로 배포 시 사용하기 힘들어 하는 사용자가 존재 => 배포시 간단히 exe 로 변환 가능

python requests Crawler와의 차이점

사실 이전부터 사용해오던 간단한 Web Crawler가 존재했습니다.
python 기반으로 가장 쉽게 제작할 수 있는 Beautifulsoup과 requests를 이용한 Crawler였죠.

기능은 간단했습니다.

  • 목표 사이트에 로그인
  • 원하는 커뮤니티로 이동
  • 게시물목록을 읽어들여 게시물 내부의 이미지를 모두 다운로드

해당 프로그램은 약 1년 이상 안정적으로, 또한 성공적으로 그 역할을 완수했습니다.

하지만 최근 해당 사이트의 업데이트로 로그인 보안 강화라는 어쩔 수 없는 이유가 발생하게 됩니다.
requests의 로그인 방식은 id와 password를 해당 사이트에 parameter 로 날려서 로그인 세션을 생성해오게 됩니다.
로그인 세션을 발생시키는 url을 확인 후 해당 페이지가 원하는 parameter를 보내주는 방식인거죠.

하지만 이번 업데이트에서는 복잡한 javascript 라이브러리로 사용자의 password와 server 에서 보낸 1회성 key를 조합하여 암호화한 parameter를 넘겨야만 Session이 생성되도록 변경되었습니다.

requests 기반 Crawler의 한계를 느끼는 순간이었습니다.

javascript function 이용의 필요성

사이트 로그인방식은 사실 간단합니다. id 와 pw 를 입력하는 란에 알맞게 넣은 뒤 로그인 버튼을 클릭해주면 되죠. 그 뒤의 복잡한 javascript 구동방식이라던가, 암호화 과정은 고려할 필요가 없습니다.
Selenium 역시 사용자가 입력하는 것 처럼 적절히 입력하고 클릭이벤트를 발생시켜 줍니다.
requests는 문자 형식으로 넘어온 html을 분석하기 때문에 javascript function을 실행시킬 수 없었다면, Selenium은 브라우저 자체를 이용하기 때문에 javascript function 까지도 충분히 이용이 가능합니다.

어라… 뭔가 더 좋은게 아닌가?

다만 속도적인 측면에서는 무조건 requests가 빨랐습니다. 아무래도 브라우저가 해당 페이지를 읽어들이는데 필요한 시간이 존재하기 때문이겠지요.


Selenium 설치

본 포스트는 python 3.5가 이미 설치되어 있는 환경이라고 가정하에 작성됩니다. 많은 호환성이 걱정되신다면 Anaconda 환경에서 python 3.5 를 추가하여 사용하시기를 추천드립니다.

1
pip install selenium

설치는 간단히 완료되었습니다. 또한 실제 브라우저가 필요하므로 chrome이 설치되지 않았다면 빠르게 설치를 진행해줍니다.

다음은 Chrome 기반으로 작성된 Webdriver 인 ChromeDriver 를 다운로드 받아줍시다.

URL : https://sites.google.com/a/chromium.org/chromedriver/downloads

준비 완료!

라이브라리 import

우선 필요한 라이브러리들을 import 해줍니다.

1
2
3
4
import os  
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

selenium.webdriver.common.keys는 실제로 사용자가 입력하는 key 이벤트를 발생시키기 위한 라이브러리 입니다.
ID와 PW를 입력해 줘야 하니 import 합니다.

다음은 Chrome 구동시 옵션입니다. --headless 를 부여하면 chrome 이 백그라운드에서 동작하며 좀더 속도가 향상됩니다. (headless 모드는 chrome 버전 63 부터 사용 가능합니다.)
ChromeDriver를 제작중인 py 파일과 동일한 폴더로 이동시킨 뒤에 해당 Path 를 잡아줍니다.

1
2
3
4
chrome_options = Options()  
chrome_options.add_argument("--headless")
chrome_options.binary_location = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe'
driver = webdriver.Chrome(executable_path=os.path.abspath("chromedriver"), chrome_options=chrome_options)

Chrome을 구동합니다.

1
driver.get("https://logins.daum.net/accounts/loginform.do")

해당 페이지가 로드된 뒤 로그인 정보를 입력하고 로그인 버튼을 클릭 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
my_id = driver.find_element_by_id("id")       #아이디를 입력할 input 위치
my_pw = driver.find_element_by_id("inputPwd") #비밀번호를 입력할 input 위치
login_button = driver.find_element_by_id("loginBtn") #로그인버튼

if login_button.is_displayed():
my_id.clear()
my_id.send_keys("아이디")
my_pw.clear()
my_pw.send_keys("패스워드")
login_button.click()

driver.quit()

my_id.clear()로 혹시나 있을지 모르는 초기값을 제거해준 뒤 my_id.send_keys("아이디") 해당 구문을 지정된 input 에 입력해줍니다.

입력이 완료되었다면 login_button.click()으로 로그인을 진행합니다.

driver.quit()는 Chrome을 종료시키는 구문입니다. 프로그램이 완료된 뒤 Chrome 이 종료되기를 원한다면 잊어버리면 안됩니다. (특히 headless의 경우 눈에보이지 않기 때문에 자칫하다가 어마어마하게 실행되어버리는 경우가 발생합니다.)

마무리하며

Selenium은 requests보다 러닝커브가 높은편입니다. 또한 다른 사용자를 위해 제작한 프로그램을 exe로 배포하더라도 chrome 과 chromedriver 를 별도로 다운로드 받아야 하는 등의 불편점도 존재합니다.
하지만 훨씬 강력하며, 매력적인 프레임워크임에는 틀림없어 보입니다.

[Oracle] Row to Column, 행을 열로 합치기

여러 행을 특정 구분자(예:콤마[,])로 구분하며 합쳐야할 경우 사용되는 SQL 이다.

1
2
3
4
5
6
7
8
9
SELECT (SUBSTR (SYS_CONNECT_BY_PATH (PART_NM , ','), 2)) csv
FROM (
SELECT X.PART_NM , ROW_NUMBER () OVER (ORDER BY X.PART_NM ) rn,
COUNT (*) OVER () cnt, X.NFIX_REQ_NO
FROM Table_One X
)
WHERE rn = cnt
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1

결과 : 콤마로 구분지어져 한줄로 출력된다.

Equal Join의 대표적인 3가지

오라클 기준으로 작성된문서이지만 원리및 장단점을 쉽게 설명했기에 올려봅니다.


개요

관계형 데이터 베이스에서 데이터 연결 방법 중 Join의 종류, 조인의 수행원리, 각 조인의 특징, 그리고 조인별 선택기준에 대해서 소개하고자 한다.

Join 정의

조인은 두 집합간의 곱으로 데이터를 연결하는 가장 대표적인 데이터 연결 방법이다.
종류에는 Nested Loop Join, Sort Merge Join 그리고 Hash Join이 있다.
1 * M = MM * 1 = M 의 결과집합이 동일한 것처럼 Optimizer가 3가지의 조인 중 어떤 것을 선택할지라도 결과집합은 동일하다.

하지만 수행속도 측면에서 본다면 조인하고자 하는 두 집합의 데이터 상황에 따라 어떤 조인을 선택하느냐, 어떤 집합을 먼저 선행하느냐 에 따라 수행속도에 미치는 영향은 크다.


수행원리

100쌍의 남녀가 사랑의 짝대기 하는 것에 비추어 3가지 조인방식이 수행되는 원리를 설명해 보자.

남녀 모두는 자기가 원하는 상대방의 번호표 하나씩 가지고 있고, 한 사람은 여러 사람으로부터 선택 받을 수 있다.

Nested Loop Join

Nested Loop Join은 선행집합의 처리 범위가 결정되어 지면 후행집합의 일량이 정해지는 종속적 방식이다.

첫번째 여자는 자기가 선택한 번호표를 가지고 처음부터 차례로 남자의 번호를 확인하고, 해당 번호의 남자가 자기를 선택했는지 확인한다.
그리고 두 번째, 세 번째…백 번째 여자까지 같은 작업을 반복 수행하게 된다.
이처럼 선행 집합의 선두부터 차례로 후행집합과 조건을 비교 하면서 선행집합의 처리범위가 끝날 때 까지 같은 작업을 반복하는 것이 Nested Loop Join이다.

특징 및 사용기준

온라인 어플리케이션에서 주를 이루는 Nested Loop Join은 부분범위 처리나 사용자가 데이터를 요구 했을 때
짧은 시간에 결과를 볼 수 있는 적은 데이터를 액세스 할 때 쓰인다.

다음과 같은 SQL을 예로 들어 보자.

1
2
3
4
5
SELECT a.FLD1, ..., b.FLD1,...  
FROM TAB2 b, TAB1 a
WHERE a.KEY1 = b.KEY2
AND b.FLD2 like 'A%'
AND a.FLD1 = '10'

조인 컬럼인 a.KEY1 = b.KEY2 에 양쪽 테이블 모두 인덱스가 존재하고,
선행 테이블을 TAB1으로 했을 때와 TAB2로 했을 때의 수행횟수를 비교하여 보자.

  • TAB1이 선행테이블 일때
    1 a.FLD1 인덱스 5000건 Range Scan.
    2 RowidTAB1에 5000회 랜덤액세스
    3 성공/실패에 상관없이 b.KEY2 인덱스에 5000회 랜덤액세스 및 조인시도
    4 조인에 성공한 RowidTAB2에 100회 랜덤액세스
    5 b.FLD2 like 'A%' 체크 후 성공한 50건 운반단위 이동
  • TAB2가 선행테이블 일때
    1 b.FLD2 인덱스 100건 Range Scan.
    2 TAB2의 100회 랜덤액세스
    3 성공/실패에 상관없이 a.KEY1 인덱스에 100회 랜덤액세스 및 조인시도
    4 조인에 성공한 RowidTAB1에 70회 랜덤액세스
    5 a.FLD1 = '10' 체크 후 성공한 50건 운반단위 이동

결과건수는 두 가지 수행방식 동일하게 50건이지만, 수행횟수 측면에서 본다면 TAB1을 선행테이블 했을 때는 5000회의 조인시도가 발생하였고,
TAB2를 선행테이블로 했을 때는 100회의 조인시도가 발생하였다.
이처럼 조인 순서 및 선행 테이블의 처리범위에 따라서 수행횟수는 크게 달라질 수 있다.

특징
  • 선행 테이블의 처리범위가 일량을 결정한다.(방향성)
  • 선행 테이블의 값을 받아서 후행 테이블의 처리범위가 결정된다.(종속적)
  • 주로 랜덤 액세스 방식으로 처리된다.(랜덤액세스)
  • 후행 테이블의 조인컬럼의 인덱스의 유무조건의 인덱스 참여의 정도에 따라 수행속도가 많이 차이 난다.(연결고리 상태)
사용기준
  • 부분범위처리를 하는 경우에 유리하다.
  • 처리량이 적은 경우에 유리하다.- 랜덤액세스가 많을 경우 수행속도를 보장할 수 없으므로 Sort Merge Join이나 Hash Join으로 유도
  • 선행 테이블의 결과를 받아야만 후행 테이블의 처리범위를 줄일 수 있는 경우에 유리하다. - 연결고리에 Index가 반드시 존재하여야 함
  • 선행 테이블의 처리범위가 수행속도에 절대적 영향을 미치므로 최적의 조인 순서가 될 수 있도록 유도해야 한다.

Sort Merge Join

Sort Merge Join은 처리범위를 결정하는데 독립적이다.

남녀는 각각 자기가 선택한 상대방의 번호표(Join Key) 순으로 각각 줄(Sort)을 선다.
그러면 중간의 아나운서가 차례로 양쪽의 번호표가 일치하는지를 확인하면서 번호표가 맞다면 짝을 지어줄 것이다.
이처럼 각각의 집합은 자기에게 주어진 조건으로 처리범위를 결정하고, 조인 컬럼으로 각각 Sort 한 후 조인하는 방식이 Sort Merge Join이다.

특징 및 사용기준

다량의 데이터를 스캔방식으로 처리하는 Sort Merge Join은 양쪽테이블을 각자 액세스하여 처리 범위를 줄이고,
조인컬럼 순으로 데이터를 Sort 후에 조인하는 방식이다.

1
2
3
4
5
SELECT a.FLD1, ..., b.FLD1,...  
FROM TAB2 b, TAB1 a
WHERE a.KEY1 = b.KEY2
AND b.FLD2 like 'A%'
AND a.FLD1 = '10'

수행 과정

1 a.FLD1 인덱스 Range Scan.
2 RowidTAB1에 랜덤액세스
3 조인컬럼인 a.KEY1SORT
4 b.FLD2 인덱스 Range Scan.
5 RowidTAB2에 랜덤액세스
6 조인컬럼인 b.KEY2SORT 한다.
7 양쪽 집합을 Scan하면서 a.KEY1 = b.KEY2 조인 시도
8 성공한 Row 운반단위 이동

수행과정에서 나타나듯이 Nested Loop Join과 달리 상대 테이블의 결과에 의해 처리범위가 결정되는게 아니라
스스로에게 주어진 조건 만으로 처리범위를 줄인 후 Sort하게 되므로, 조인 컬럼으로 이루어진 인덱스는 사용하지 않게 된다.

특징
  • 상대 테이블로부터 결과 값을 제공받지 않고, 자신에게 주어진 조건으로만 처리범위를 결정한다.(독립적).
  • 각자 SORT후에 조인을 하게 되므로 부분범위 처리가 아닌 전체범위 처리를 하게 된다.(전체범위 처리)
  • 조인의 순서에는 상관없다.(무방향성)
  • 인덱스가 아닌 컬럼도 Merge할 작업 대상을 줄이므로 중요한 의미를 가진다.
사용기준
  • 처리량이 많거나 전체범위 처리 시에 유리하다. 랜덤액세스가 많은 Nested Loop Join은 불리
  • 스스로 자신의 처리범위를 많이 줄일 수 있을 때 유리하다.
  • 연결고리 이상 상태에 영향을 받지 않으므로 연결고리 컬럼을 위한 인덱스를 생성하지 않고도 유용하게 사용할 수 있다.
  • 처리할 데이터량이 적은 온라인 어플리케이션에서는 Nested Loop Join이 유리한 경우가 많으므로 Sort Merge Join은 주의하여 사용한다.

Hash Join

Hash Join 역시 처리범위를 결정하는데 독립적이다.

1번부터 100번(Hash Table)의 푯말이 있다.
여자측은 자기가 가지고 있는 상대방의 번호표 숫자푯말 앞에 서는 것이다(Hash Function).
물론 각 푯말에는 여러 명의 여자가 서 있을 수도, 한명도 없을 수도 있다.
다음으로 남자는 자기 번호푯말 앞으로 가서 남자가 가지고 있는 번호와 상대 여성의 번호와 맞는지를 비교하면 된다.

이처럼 선행 집합은 Hash Function을 이용하여 Hash Table을 구성하고,
후행집합은 차례로 Hash Function을 이용하여 Hash Table을 탐침하는게 Hash Join 수행 원리다.

특징 및 사용기준

대량의 데이터를 액세스하는 작업에서는 시스템 리소스를 많이 사용하는 대신 짧은 시간에 보장할 수 있어야 한다.

1
2
3
4
5
SELECT a.FLD1, ..., b.FLD1,...  
FROM TAB2 b, TAB1 a
WHERE a.KEY1 = b.KEY2
AND b.FLD2 like 'A%'
AND a.FLD1 = '10'

수행 과정

1 두 테이블 중 적은 테이블을 선행 테이블로 결정한다.
2 선행 테이블을 Hash Function을 이용하여 Hash Area에 Hash Table을 구성한다.(Build Input)
3 만약 Hash Area만으로 생성 가능하다면 후행테이블은 크기에 상관없이 차례로 Hash Function을 이용하여 Hash Table과 조인(Probe Input)하면서 성공한 결과값을 운반단위로 이동한다.
4 만약 Hash Area만으로 Hash Table 생성이 불충분 하다면 Hash Table Overflow가 발생하여 데이터를 나눠서 저장 할 Partition 수를 결정한다.(Fan -out)
5 선행 테이블의 조인 컬럼과 Select List 컬럼을 메모리로 읽어 들여 첫번째 해쉬 함수를 이용하여 Partition을 Mapping하고, 두번째 해쉬 함수를 이용하여 해쉬 테이블 생성시 사용 할 해쉬 값을 생성한다.
6 선행 테이블의 조인 컬럼의 유일 값만으로 Bit-Vector을 생성한다. (추후 Bit-Vector filtering에 사용하기 위함.)
7 Partition에 데이터를 MOVE하고 채워진 Partition은 디스크로 내려간다.
8 선행 테이블이 모두 읽혀지면 Partition 테이블을 완성하고, Partition 크기순으로 정렬한 후 작은 Partition N개를 메모리에 로드한다.
9 후행 테이블을 읽으면서 조인컬럼으로 Bit-Vector와 Filtering에 성공하였다면, 첫번째 해쉬함수로 Partition을 결정하고, 두번째 해쉬 함수를 이용하여 메모리 상에 있는 선행테이블과 조인하고 성공하면 운반단위로 이동하고, 해당 Partition이 메모리에 존재하지 않는다면 해쉬 키값,조인컬럼, Select List를 디스크에 쓴다.
10) 후행 테이블이 모두 읽혀지면, Bit-Vector Filtering에 성공했지만, 조인에 성공하지 못해 미 처리된 선행 파티션과 후행 파티션을 메모리에 올려 차례로 반복수행 한다.

액세스해야 할 데이터가 많을 경우 Sort Merge Join은 Merge 단계에 들어 가기 위해 양쪽 테이블의 처리 범위가 SORT 되어야 하므로 SORT에 대한 부담이 크고,
Nested Loop Join은 선행 테이블의 처리 범위가 넓을 경우 그 만큼 랜덤 액세스의 발생으로 수행속도를 보장할 수 없다.
이에 반해 Hash Join은 다른 조인에 시스템 리소스를 가장 많이 사용하지만 Hash Function을 이용함으로써 Sort를 하지 않고,
각 테이블에 한번만 액세스하여 조인이 이루어 지므로 큰 테이블간이나, 큰 테이블과 적은 테이블의 조인에 효율적인 조인 방법이다.

특징
  • 다른 테이블의 결과 값을 제공받지 않고, 자신에게 주어진 조건으로만 처리범위를 결정한다.(독립적).
  • 해쉬 함수를 이용 하게 되므로 부분범위 처리를 할 수 없으며 전체범위 처리를 하게 된다.(전체범위 처리)
  • 메모리 영역만으로 해쉬 테이블을 생성시 최적의 효과를 낼 수 있으므로 적은 테이블이 선행으로 온다.
  • 해쉬 함수를 이용하므로 결과값의 정렬을 보장 받을 수 없다.
사용기준
  • 대량의 데이터 액세스 시, 배치 처리, Full Table Scan 하면서 조인 해야 할 때 유리하다.
  • 비용은 많이 들지만 수행속도를 보장해야 하는 작업에 유용하다.(Parallel Query 사용)
  • 가능한 메모리 내에서 작업 가능하도록 init Parameter나 Session 정보를 변경하여 사용한다. (Hash_area_size, Hash_multiblock_io_count 등..)

마무리

수행속도는 시스템 리소스와 즉결된다. 사용자는 작업의 성격을 분명히 하고, 작업에 맞는 조인은 선택하여야만 수행 속도를 보장할 수 있다.
SQL작성 후 반드시 실행계획를 확인 하여 Optimizer가 사용자가 원하는 액세스를 하는 확인하는 습관을 들어야 한다.