> 정보 출처: https://dreamhack.io/
웹 브라우저를 사용할 때 주소창에서 HTTP 또는 HTTPS 라는 글자를 볼 수 있다. 예를 들어 웹 브라우저로 드림핵 홈페이지에 접속하면 주소창에 https://dreamhack.io
가 입력되어 있는 것을 볼 수 있다.
HTTP 또는 HTTPS라는 URI의 구성 요소 중 Scheme(Protocol)에 해당한다. Protocol(프로토콜)은 컴퓨터 내부 혹은 컴퓨터 사이에서 어떻게 데이터를 교환할지를 정의하는 규칙 체계이다.
HyperText Transfer Protocol(HTTP), HyperText Transfer Protocol Secure Socket Layer(HTTPS) 은 웹에서 이루어지는 통신을 정의한 프로토콜이다.
TCP
혹은 TLS(암호화된 TCP)를 사용해 통신하고 기본 포트로 80(HTTP), 443(HTTPS) 포트를 사용한다.
포트 번호는 서버의 설정을 통해 변경 가능하다. 무조건 서버의 포트 번호가 80, 443으로 서비스되는 것은 아니다. 예를 들어, 웹 서버 중 많이 사용되고 있는 톰캣 서버의 기본 포트 번호는 8080입니다.
HTTPS는 HTTP의 문제점인 데이터의 평문 전송을 보완하기 위해 등장하였다. 하지만 HTTP와 HTTPS의 핵심 구조 및 동작 원리는 동일하기 때문에 HTTP로 통칭하기도 한다.
HTTP는 사용자가 서버에 요청을 하는 Request와 사용자의 요청에 대한 서버의 응답인 Response로 나뉘어진다.
아래 사진에서는 HTTP의 Request와 Response의 간단한 데이터 구조이다.
HTTP Request는 서버에 대한 요청을 의미한다. 사용자와 서버가 서로 통신을 하기 위해서는 서로가 이해할 수 있는 데이터 구조를 전달해야 한다.
HTTP의 구조에서 각각의 줄은 CRLF
로 줄 바꿈이 이루어져야 한다.
HTTP Request의 구조 중 가장 첫 번째 줄에는 사용자가 서버에 요청 시 수행하고자 하는 동작인 Method
, 요청하는 웹 리소스의 경로인 Path
, 사용하는 HTTP의 버전을 나타내는 Version
으로 구성된다.
두 번째 줄부터는 Header
부분이다. Header는 이름: 값
형태로 이루어진다.
Header는 상황에 따라 많은 데이터를 포함할 수 있기 때문에 Header 부분의 끝을 표시하기 위한 CRLF을 한 번 더 출력한다.
마지막으로 사용자의 데이터를 담는 부분인 Body가 있다.
메소드들은 각각의 목적을 두고 설계되었지만, 서버에서 설정하는 방식이나 웹 어플리케이션의 처리에 따라 수행하는 방식이 다르게 사용될 수 있다.
HTTP Response는 사용자의 요청에 대한 서버의 응답을 의미한다.
Response의 구조도 Request의 구조와 마찬가지로 각 줄은 CRLF
로 줄 바꿈이 이루어져야 한다.
HTTP Response의 구조 중 가장 첫 번째 줄에는 Version과 사용자의 요청에 대한 서버의 상태 응답 코드인 Status code로 구성된다. 두 번째 줄부터는 Header 부분이다. Header 부분의 각 줄은 이름: 값
의 형태로 이루어진다. Header의 끝을 표시하기 위해 CRLF를 한 번 더 출력한 후, 서버의 응답 데이터 부분인 Body로 구성된다.
웹 해킹에서는 사용자의 입력에 의한 서버의 응답을 주목해야 한다. 예를 들어 악의적인 입력을 보냈을 때 500 Status code(Internal Sever Error)를 응답하면 해당 입력이 서버에 어떠한 영향을 끼쳤다고 짐작할 수 있고 취약점으로 도출해낼 수도 있다.
Request
GET
/index.html
HTTP/1.1
Host: dreamhack.io
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Response
HTTP/1.1
200 OK
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 61
Connection: Keep-Alive
Content-Type: text/html
<!doctype html>
<html>
<head>
</head>
<body>
</body>
</html>
Request
GET
/not_found.html
HTTP/1.1
Host: dreamhack.io
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Response
HTTP/1.1
404 Not Found
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 255
Connection: Keep-Alive
Content-Type: text/html
<!doctype html>
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /not_found.html was not found on this server.</p>
<hr>
<address>Apache/2.4.29 (Ubuntu) Server at dreamhack.io Port 80</address>
</body></html>
Request
POST
/login
HTTP/1.1
Host: dreamhack.io
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Content-Length: 16
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
username={공격코드}
Response
HTTP/1.1
500 Internal Server Error
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 0
Connection: close
Content-Type: text/html