본문 바로가기

Network, Security

HTTP(Hyper Text Transfer Protocol)

HTTP(Hyper Text Transfer Protocol)

HTTP는 W3C 표준 프로토콜을 사용해서 웹 브라우저와 웹 서버 사이에 메시지를 송신하거나 수신하는 프로토콜이다. HTTP는 개방형 프로토콜로 송수신되는 메시지의 구조가 공개되어 있다. 통신 시 TCP를 이용한 통신을 하여 신뢰성있는 통신을 한다. 초기 HTTP Version 1.0은 요청한 데이터에 대해 응답후 연결이 끊기는 형태로 이루어졌다. 하지만 버전이 올라가면서 연결을 유지한 상태로 데이터를 주고받을 수 있는 형태로 발전했다.

HTTP는 WWW(World Wide Web)으로 시작하는 인터넷에서 웹 서버와 사용자의 인터넷 브라우저 서버에 문서를 전송하기 위해 사용하는 통신 프로토콜이다. TCP 80번 포트를 기본으로 사용하고 Request(요청) 및 Response(응답) 구조를 가진다.

 

HTTP Version 1.0

연결을 수행할 때마다 3-Way Handshaking 방식을 사용한다. HTML, 페이지를 수신 받고 완전히 연결을 종료 시키는 형태이다. 새로운 페이지, 데이터가 필요할 때 다시 연결을 요청하고 끊는 과정을 반복하여 Stateless한 특징을 갖고 있다.

 

HTTP Version 1.1

연결을 종료하지 않고 유지하는 Keep Alive Connection을 지원한다. 사용자의 연속된 연결 요청이 있을 경우 페이지 수신 후 연결을 종료하지 않고 다음 요청을 기다린다.

 

HTTP Version 2.0

HTTP 2.0은 더 빠른 데이터 처리를 위해서 멀티플렉싱(Multiplexing), 헤더압축(Header Compression), 서버 푸시(Server Push) 등의 기술이 추가된 프로토콜이다. 멀티 플렉싱은 순차적 연결이 아니라 동시 다발적인 양방향 통신을 지원하는 것이고 헤더압축은 헤더 정보를 1/3 수준으로 압축해서 보다 빠르게 메시지를 처리하는 것이다. 서버 푸시는 웹 서버가 웹 브라우저에게 필요한 데이터를 알아서 미리 전송할 수 있는 기술로 요청 횟수와 전송해야 하는 데이터의 양을 줄일 수 있는 기술이다.

 

HTTP 프로토콜 구조

HTTP는 HTTP Header와 Body로 이루어져서 송신되거나 수신된다. Header는 HTTP Request 시에 전달해야 하는 웹 브라우저 정보, 요청방식, 파라미터 등이 있고 HTTP Body는 웹 서버에 데이터를 전달해야 될 때 필요한 데이터가 입력된다.

HTTP 패킷 캡쳐

위의 그림은 HTTP 통신을 캡쳐한 것이다. 초기에 3-Way Handshaking을 통해 웹 서버와 연결을 하고 HTTP 통신 상태가 활성화 된다. Header를 보면 사용하는 HTTP의 버전과 요청한 서버의 IP, 브라우저 정보 등이 표시되며 각각의 항목은 \r\n로 구분된다. Header와 Body는 \r\n\r\n으로 구분된다.

HTTP Header와 Body 구분 지점

 

HTTP Request 시 Header 구조

Request Method 호출되는 메소드로 GET, POST, OPTIONS, PUT, DELETE, TRACE, CONNECT 등을 사용할 수 있다. 각각의 메소드는 용도가 어느 정도 정해져 있지만 대부분 GET과 POST로 구현할 수 있기 때문에 보안상의 이유로 다른 메소드는 잘 사용하지 않는다.
Accept 웹 브라우저에서 사용 가능한 미디어 타입을 나타낸다.
Accept-Language 웹 브라우저가 인식할 수 있는 언어를 의미한다.
User-Agent 웹 브라우저 정보이다.
Accept-Encoding 웹 브라우저에서 제공되는 인코딩 방식을 의미한다.
Host 웹 서버의 기본 URL, IP를 나타낸다.
Connection 연결 지속 및 연결 끊기를 나타낸다. Keep Alive 또는 Close가 있다.
Cache-Control 웹 서버의 데이터를 어떻게 사용할지에 대한 설정이다. 여기서 데이터는 HTML, JSON 등을 의미하며 정적 페이지의 경우 한 번 접속 하면 일정 기간동안 해당 페이지가 브라우저에 저장되어 다음에 접속 시 빠르게 로드되는 형태이다. 이러한 캐시를 얼마나 저장할지, 재 요청할지 등 설정할 수 있는 것이다. 이 부분을 이용하여 캐시를 무한히 요청하고 서버의 자원을 고갈 시키는 CC공격도 있다.

웹 서버와 통신시 해당 정보들이 웹 서버로 전송되기 때문에 웹 서버에서는 해당 정보들을 바탕으로 사용자의 브라우저 환경에 맞게 서비스를 제공할 수 있는 것이다. 예를 들어 언어 부분을 확인하여 한국어로 설정되어 있을 시 한국어 페이지를 보여주고 영어로 되어있다면 영어로된 페이지를 보내주는 등의 작업을 할 수 있으며 웹 브라우저 정보를 확인하여 해당 서비스를 사용하기에 적합한 브라우저인지, 은행 업무의 경우 취약한 브라우저를 사용하는건 아닌지 등을 확인한다.

 

HTTP Response 시 Header 구조

Status Code HTTP 응답코드를 의미하고 여러 상태 코드가 있으며 200은 성공적으로 처리한 것을 의미한다. 이외에 자주보이는 404는 서버는 정상 동작중 이지만, 사용자가 요청한 페이지를 알 수 없을 때 나오는 페이지이다.
Server 서버 프로그램 이름과 버전 전송을 의미한다.
Expires 자원의 만기 일자를 의미한다.
Cache Control 캐시 사용 여부를 나타내며 no-cache의 경우 이름과 다르게 서버에 cache를 재요청할 때 사용된다.
Pragma 캐시 사용 여부를 나타낸다. HTTP/1.0에서 쓰이며, HTTP/1.1에서는 Cache Control에서 쓰인다.
Content-Encoding 응답되는 메시지의 인코딩 방식을 의미한다.
Content-Length 바이트 단위로 응답되는 리소스의 크기이다.
Keep-Alive 연결 유지 시간을 의미한다.
Connection Keep-Alive 사용 여부를 의미한다.
Content-Type 응답되는 미디어 타입을 의미한다.

 

HTTP 메소드 타입

GET URL에 해당되는 자료를 제공해 줄것을 요청하는 것이다. 웹 서버에 저장된 정보를 단순히 요청하기 위해 사용되는 방법으로 클라이언트가 GET과 함께 URL을 전달하면 웹 서버는 해당 정보를 클라이언트의 브라우저로 회신한다.
HEAD GET과 유사한 방식이나 웹 서버에 헤더 정보 이외에는 어떠한 정보도 보내지 않는다. 주로 웹 서버의 다운 유무 점검과 웹 서버 정보 등을 얻기 위해 사용한다.
PUT 원격지 서버에 지정한 콘텐츠를 저장하기 위한 목적으로 사용된다. 악용하여 홈페이지 위변조에 사용할 수 있다.
POST 웹 페이지를 변경하거나 웹 페이지에 내용이 추가되되록 서버에 전송할 때 사용된다.
DELETE 클라이언트가 권한이 있다면 웹 서버에서 웹 페이지를 제거하는 것을 허용한다.
TRACE 디버깅에 사용한다.
OPTIONS 시스템에 지원되는 메소드의 종류를 확인할 수 있다.
CONNECT 웹 서버에 프록시 기능을 요청할 때 사용한다.

메소드 타입에는 위와 같은 종류가 있으며 자주 사용되는 메소드는 GET과 POST이다. 각각은 유저가 원하는 데이터를 요청하기 위해 입력값과 함께 전달하는 것으로 GET은 URL에 포함하여 전송되고 POST는 전송되는 패킷의 Body에 포함되어 전송된다. 이외에 차이점은 GET의 경우 전달할 수 있는 데이터의 길이에 제한이 있으며 POST 방식은 데이터 길이에 제한이 없다. 보안상 생각할 때 둘 중 뭐가 더 안전하다고 할 수는 없다. 단순히 URL에 노출되는지 HTTP Body 영역에 있는지 차이로 공격자에게 노출되는 것은 마찬가지여서 굳이 위험한 것을 고르자면 전송 길이의 제한이 없는 POST가 비교적 위험하다고 생각한다.

반응형