* HTTP : Web(WWW : World Wide Web) 상에서 Client와 Server간 HyperText 문서의 Request/Response 통신을 위해 개발된 프로토콜
- 1991년 HTTP 0.9 이후, 1996년 1.0, 1999년 1.1 버전이 발표되어 사용 중
HyperText 문서 : 대표적으로 HTML(Hyper Text Markup Language)가 있으며, 참조 혹은, 링크를 통해 한 문서에서, 다른 문서로 접근할 수 있는 문서를 의미
* HTTP 특성
1) 비 연결형 (Connectionless) 프로토콜
- 기존 HTTP 1.0 버전의 경우 Request에 대한 Response 이후에 TCP 연결을 바로 종료하는 구조였으나, HTTP 1.1 버전부터는 Connection Header에 Keep-Alive 옵션(부가적으로, 연결 지속 시간(timeout) 및 최대 요청 건수(max) 설정)이 추가되어, 연결이 일정 시간 유지 되어 추가 자원 요청이 발생할 시, 효율적 통신이 가능함
- 웹 서버 설정 파일(아파치 기준)의 Keep-Alive 관련 설정 파일 확인 시, KeepAlive 사용 여부, 연결을 지속하는 동안, 최대 요청 건수(max), 연결 지속 시간(timeout)을 설정 할 수 있음
2) 상태 정보를 유지하지 않는(Stateless) 프로토콜
- 동일 클라이언트의 현재 요청과 이전 요청을 식별하지 못하며, 서비스 특성상 상태 정보의 유지가 필요한 경우, Cookie 또는 Session을 통해 유지함
* HTTP 상태정보 유지 기술
1) Cookie 방식 : 개별 클라이언트 상태정보를 HTTP 요청/응답 헤더에 담아 전달하는 정보/데이터
- 서버가 Set-Cookie Response Header를 통해 쿠키를 설정 후, 클라이언트가 수신, 이후 클라이언트는 Cookie Request Header를 이용해 지속적으로 사용, 전달하는 형태
Cookie 종류 구분 (지속 시간에 따른 분류) |
내용 |
영속 쿠키 | * 클라이언트에 File 형태로 지속적(또는 일정 기간)으로 존재 - 사이트 요청 시 마다, Cookie Request Header에 정보를 담아서 전달 |
세션 쿠키 | * 클라이언트 Memory상에 세션이 유지되는 동안 존재 - 세션 종료(보통 웹 브라우저 종료) 시 소멸 |
- Cookie 사용 보안 취약점 : 해킹, 스니핑 등에 의한 변조, 외부 노출에 취약한 특성으로, 중요 정보를 저장할 시, 세션 방식을 권장하며, 부득이 한 사용에는 암호화를 적용하여야 함
2) Session 방식 : 개별 클라이언트 상태정보를 서버에 저장하는 기술
- 서버가 각 클라이언트의 세션 식별을 위해 Session ID를 부여하며, Session ID는 세션 쿠키를 이용하여, 클라이언트와 서버간에 주고 받으며, 상태정보를 서버에 저장하여 쿠키 방식에 비해 안전(단, 공격자가 정상 사용자 세션 ID정보를 탈취하는 HTTP Session Hijacking 발생 시, 정상 사용자로 위장 접근이 가능)
* HTTP Cookie 관련 보안 속성
1) httponly 속성 : Set-Cookie Response Header에 설정하는 속성으로, 클라이언트에서 스크립트(JS 등)를 통해 해당 쿠키게 접근하는 것을 차단하는 속성 (보통, Session ID를 저장하는 세션 쿠키 탈취 목적의 XSS 공격에 대응하기 위해 사용)
2) secure 속성 : Set-Cooke Response Header에 설정하는 속성으로, 클라이언트에서 HTTPS(SSL/TLS) 통신일 경우에만, 해당 쿠키를 전송하는 속성으로, 평문 쿠키 노출을 방지하여 기밀성(Confidentiality)를 보장
* HTTP Request Message 구조
1) Request 구문 형식
HTTP Request 메세지 형식 | 내용 |
Request Line | * 요청 메소드, 요청 URI, HTTP 버전 정보를 담는 한 행의 구성 - 각 정보는 공백(ascii 0x20)으로 구분 - 개행의 경우 CRLF(Carriage Return, Line Feed - ascii 0x0d0a)로 표현 |
Request Header | * 각각의 헤더 정보는 개행(CRLF)로 구분 * 주요 요청 헤더 정보 - Host : 요청 대상 서버의 도메인명/호스트명과 포트 정보 - User-Agent : 요청 클라이언트의 어플리케이션/OS 정보 - Referer : 현재 요청 URL 정보를 담고 있는 이전 문서의 URL 정보 |
Empty Line | * 헤더의 끝을 의미하는 개행 - 헤더 개수가 가변이기 때문에, 식별을 위해 필요 |
Request Message Body | * 클라이언트에서 서버로 전송하는 데이터를 담는 부분 (GET은 바디가 없음) |
2) HTTP Request Message 주요 요청 Method
Method | 내용 |
GET | * 요청 URI로 지정한 자원을, 서버에 요청하는 Method - Request Body가 필요 없으며, 필요 시에는 Query String을 이용하여, 제한된 데이터 전송이 가능 - URI에 전달 데이터가 노출되며, 서버 access log에 그대로 남아 보안상 매우 취약 (POST 사용 권장) |
POST | * 요청 URI로 지정한 자원에 데이터를 전달, 이를 처리한 결과를 서버에 요청하는 Method - Request Body를 포함하는 Method |
HEAD | * GET과 유사하게 요청하나, 서버 응답시에 응답 메세지 바디를 제외한 헤더부만 응답해주는 Method - 요청 자원에 대한 처리는 서버에서 이루어지나, 해당 결과로 헤더값만을 전송 (주로 검색 엔진에서 URL/링크 유효성 검증을 목적으로 사용) |
OPTIONS | * 서버가 지원하는 Method를 확인하는 목적으로 사용 - Allow 응답 헤더에서 해당 서버가 지원하는 Method 정보를 전달함 |
CONNECT | * 클라이언트와 서버간, 터널링 목적으로 사용 - Web Proxy 역할을 수행 |
PUT | * 요청 메세지 바디에 포함되어 있는 데이터를, 요청 URI로 지정한 자원으로 저장하도록 함 |
TRACE | * 클라이언트로부터 수신한 메세지를, 서버에서 그대로 반환하는 Method - 요청에 대한 루프백 테스트 용도로 사용하는 메소드 |
DELETE | * 요청 URI로, 지정한 자원을 서버에서 삭제하도록 함 |
3) Query String (요청 문자열) : 데이터 전달 방식
요청 문자열 구문 형식 | 내용 |
? | * Query String 식별자 |
param=value | * 파라미터 명 = 파라미터 값 |
& | * 각 파라미터 구분자 |
* HTTP Response Message 구조
1) Response 구문 형식
Response Message 구문 형식 | 내용 |
Status Line | * HTTP 버전, 상태 코드, 응답 구문의 한 행으로 구성 |
Response Header | * 각각의 헤더 정보는 CRLF(개행)을 통해 구분 * 주요 응답 헤더 정보 - Content-Type : 메세지 바디의 데이터 형식을 설정 - Content-Length : 메세지 바디의 전체 크기(Byte 단위)를 설정 |
Empty Line | * Header의 끝을 의미하는 개행 (헤더 개수가 가변으로, 빈 라인을 통해 끝을 식별) |
Response Message Body | * 서버에서 클라이언트로 전송하는 데이터를 담음 |
2) Response Message 주요 상태 코드
응답 | 상세 코드 | 설명 |
1xx : information (정보) |
100 | * Continue : 클라이언트로부터 일부 요청을 받았으며, 나버지 정보를 계속 요청 |
2xx : Success (성공) |
200 | * OK : 요청이 성공적으로 수행 되었음 |
201 | * Created : PUT Method에 의해 원격지 서버에 파일이 생성됨 | |
202 | * Accepted : 웹 서버가 명령을 수신함 | |
3xx : Redirection (재지정 응답 코드, 요청 자원의 위치가 재지정 되었음을 의미) |
301 | * Moved Permanently : 요청 자원의 위치가 영구적으로 변경됨 - Location 응답 헤더를 통해 자원의 변경된 URL을 반환함 |
302 | * Found : 요청 자원 위치가 임시적으로 변경됨 - Location 응답 헤더를 통해 자원의 변경된 URL을 반환함 |
|
304 | * Not Modified : 요청 자원이 변경되지 않았으므로, 클라이언트 로컬 캐시에 저장된 자원을 이용하라는 의미 | |
4xx : Client Error (클라이언트 오류 응답 코드) |
400 | * Bad Request : 요청 메세지 문법 오류 |
401 | * Unauthorized : 요청 자원에 대한 인가 필요 - 요청 자원 실행에 필요한 권한이 없음을 의미 |
|
403 | * Forbidden : 요청 자원에 대한 접근 차단 | |
404 | * Not Found : 요청 자원이 존재하지 않음 | |
5xx : Server Error (서버 오류 응답 코드) |
500 | * Internal Server Error : 내부 서버 오류 |
'Information Security > Hacking' 카테고리의 다른 글
SNMP (Simple Network Management Protocol) (0) | 2021.05.16 |
---|---|
FTP (File Transfer Protocol) (0) | 2021.05.16 |
DRDoS (Distributed Reflection DoS) (0) | 2021.03.20 |
포트 스캐닝 (Port Scanning) (2) | 2021.03.07 |
포맷 스트링 공격 (Format String Attack) (0) | 2021.03.05 |