HTTP Security

HTTP

HTTP(HyperText Transfer Protocol)는 Web(World Wide Web, WWW, W3)에서 가장 핵심이 되는 프로토콜로 웹에서 정보를 주고 받을 수 있도록 명시된 프로토콜입니다. TCP를 주로 사용하며, HTTP/3 부턴 UDP를 통한 통신도 지원하고 있고, 기본적으로 80포트와 SSL이 적용된 443 포트(https)를 가장 많이 사용합니다.

Version DT Desc
HTTP/0.9 TCP 초기 HTTP 프로토콜, 단일 Line, Only GET Method
HTTP/1.0 TCP Header 지원, Content-Type, StatusCode
HTTP/1.1 TCP Persistent Connection, Pipelining
HTTP/2 TCP Multiplexed Streams, Header Compression
HTTP/3 (QUIC) UDP QUIC(Quick UDP Internet Connections)

현재 가장 대중적으로 사용되는건 HTTP/1.1과 HTTP/2 입니다. 실제로 HTTP/2의 경우는 1.1의 확장 버전의 느낌이기 때문에 실질적으로 현재 웹을 지배하는건 HTTP/1.1입니다. 다만 HTTP/2를 지원하는 서비스도 늘어나고, 각 HTTP 버전에서 지원하고 처리할 수 있는 것들이 다르기 때문에 웹 테스팅을 위해선 각 버전의 특징은 알아두느넥 좋습니다.

🤝 Connections

각 버전에선 Connection에 대한 처리가 중점적으로 변경됩니다. 성능적인 부분을 해결하기 위함이겠지만, 보안 테스팅 입장에선 이런 처리 방식에서 공격이나 취약점의 힌트를 얻을 수 있기 때문에 알아두는 것이 좋습니다.

  • HTTP/0.9
    • 1 Connection = 1 Req + 1 Res
  • HTTP/1.0
    • 1 Connection = 1 Req + 1 Res
  • HTTP/1.1
    • 1 Connection = N Req + N Res
    • Pipelining
    • Req는 병렬, Res는 순차적으로 처리됨
  • HTTP/2
    • 1 Connection = N Req + N Res
    • Multiplexed Streams
    • Req/Res 모두 병렬 처리
  • HTTP/3
    • UDP

🌐 HTTP/0.9

초기 HTTP 버전으로 요청은 하나의 Line으로, GET Method만 지원했습니다. HTTP 헤더라는 개념도 없고 단순히 파일을 읽어서 보여주는 정보의 역할만 수행합니다.

GET /app 
<html>
  response!
</html>

🌐 HTTP/1.0

HTTP 헤더라는 개념이 도입되어 Request/Response 내 헤더를 통해 여러가지 메타 데이터를 주고받을 수 있도록 구성되었습니다. 이때부터 Request 내 버전정보가 포함되었고 Response의 Status Code를 통해 처리 상황을 파악할 수 있게 되었습니다.

GET /app HTTP/1.0
User-Agent: MyCustomApp
200 OK
Content-Type: text/html

<html>
	response!
</html>

앞의 요청(Req-Res)를 처리해야 다음 요청을 처리하기 때문에 리소스를 가져오는 구간에서 딜레이가 커지면 전체적으로 속도의 영향을 받는 단점이 있습니다.

🌐 HTTP/1.1

1.1 부턴 Persistent Connect에 대한 지원이 추가되었습니다. 그래서 지정한 시간 동안 Connection을 종료하지 않고 유지시켜 하나의 커넥션에 여러개의 요청을 전송(Pipeline)할 수 있도록 변경되었습니다. 여러개의 요청은 병렬 처리되지 않고 각각의 Response를 가집니다.

GET /app HTTP/1.1
User-Agent: MyCustomApp
200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Keep-Alive: timeout=5, max=1000
Content-Type: text/html; charset=utf-8

<html>
	response!
</html>

Pipeline을 통해 여러 요청(Req)을 동시에 전송할 수 있기 때문에 빠르게 여러 리소스를 호출하고 처리할 있게 됩니다. 이로인해 1.0의 속도 문제가 줄어들었죠. 다만 Response의 처리는 순차적으로 처리됩니다.

🌐 HTTP/2

HTTP2 부턴 Multiplexed Stream, 즉 각 요청을 Stream으로 구성해서 병렬적인 처리를 지원합니다. 그래서 Req, Res 모두 병렬로 처리가 가능합니다.

🌐 HTTP/3

QUIC(Quick UDP Internet Connections)를 기반으로 UDP를 사용하며 TCP의 구조적 문제(3-way handshake의 오버헤드)를 해결하기 위한 버전입니다. 기존 HTTP 버전에선 TCP의 Stream이 체인으로 연결되던 것과 다르게 HTTP/3에선 UDP Strream 당 각각 독립된 체인을 가집니다.