Wireshark를 이용한 간단한 HTTP/HTTPS 패킷분석

gyu·2024년 4월 21일

HTTP와 HTTPS의 차이를 "HTTP는 평문으로 데이터를 주고받고 HTTPS는 암호화된 데이터를 주고받기 때문에 안전하다" 라고만 알고있는 상태여서 Wireshark를 통해 어떤식으로 통신하고 데이터를 주고받는지 확인해보았다.

  • Wireshark: 네트워크 패킷을 캡쳐하고 분석하는 오픈소스 툴

TCP 연결 설정 (3-way Handshake)

HTTP 요청을 하기 전 TCP 연결 과정이 먼저 수립되어야 한다.
TCP 연결은 3개의 메시지가 교환되는 3-way handshake 방식으로 수행된다.

  1. 클라이언트는 서버에 SYN 패킷을 보내 연결 요청을 시작한다.
  2. 서버는 SYN-ACK 패킷으로 응답하여 요청을 수락한다.
  3. 클라이언트는 ACK 패킷을 보내 연결을 완료한다.

HTTP Request 패킷

HTTP Response 패킷

"test"라는 문자열을 return하는 RestController를 호출했을 때 위와 같이 패킷이 기록된다. HTTP Respoonse 패킷에서 Line-based text data를 확인해보면 test라는 문자열이 별도의 암호화 없이 평문으로 전달된 것을 확인할 수 있다.

HTTPS

HTTPS는 HTTP 통신을 하는 소켓 부분을 TLS 프로토콜로 대체한다.
기존 HTTP는 직접 TCP와 통신하지만 TLS를 사용하는 경우 TLS가 TCP와 통신하게 된다.

  1. Client Hello: 클라이언트가 Client Hello 메시지를 송신하면서 TLS 통신을 시작한다.
    메시지에는 TLS 버전, 사용하는 암호화 알고리즘, 키 사이즈 등이 포함되어 있다.
  2. Server Hello: 서버가 TLS 통신이 가능한 경우, Server Hello 메시지로 응답한다.
  3. Certificate: 서버가 Certificate 메시지를 송신한다. 메시지에는 공개키 증명서가 포함되어있다.
  4. Server Hello Done: 서버가 Server Hello Done 메시지를 송신하여 최초의 TLS negotiation이 끝났음을 통지한다.
  5. Client Key Exchange: 클라이언트가 Client Key Exchange 메시지로 응답한다. 메세지에는 통신을 암호화하는데 사용하는 Pre-Master secret이 포함되어있다.
  6. Change Cipher Spec: 클라이언트는 Change Cipher Spec 메시지를 송신한다. 이 메시지 이후의 통신은 암호키를 사용해서 진행한다는 것을 나타낸다.
  7. Encrypted Handshake Message: 클라이언트는 Finished 메시지를 송신한다.
    메시지에는 접속 전체의 체크 값을 포함하고 있다.
  8. Change Cipher Spec, Encrypted Handshake Message: 서버에서도 마찬가지로 Change Cipher Spec와 Finished 메시지를 송신한다. 메시지 교환이 완료되면 TLS에 의해 접속이 확립된다.

TLS 접속 확립 후 주고받은 Application Data를 살펴보면 HTTP 방식과는 달리 데이터가 암호화 되어 전달되는 것을 확인할 수 있다.

0개의 댓글