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) |
🏆 Popular Version
현재 가장 대중적으로 사용되는건 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 당 각각 독립된 체인을 가집니다.