Wireshark 패킷 분석을 통해 http와 https의 차이점 알아보기

김혜원·2022년 6월 9일
2
post-thumbnail

해당 블로그로 이전했습니다.

최근 면접을 준비하면서 http와 https의 차이점에 대해 공부하게 되었습니다. 면접에서 자주 등장하는 단골 질문이지만 이전에는 모호하게만 알고 있던 내용이었기 때문에 새롭게 정리해보게 되었습니다. 실제로 네트워크 상에서 어떤 과정이 발생하는지, https를 사용할 때 데이터가 어떻게 암호화되는지 등을 이해하고 싶었고, Wireshark라는 툴을 활용하게 되었습니다.

Wireshark는 오픈 소스 패킷 분석 도구로, 네트워크에서 전송되는 패킷(네트워크 계층의 데이터 단위)을 실시간으로 수집하고 이를 화면에 표시해줍니다. 또한 다양한 조건으로 필터링하여 원하는 패킷 정보만 검색할 수 있습니다.

http와 https를 모두 지원하는 웹사이트를 찾아서 각 프로토콜 환경의 패킷들을 분석해보았고, 그 과정에서 알게 된 내용을 정리해보았습니다.

HTTP 분석

IP 필터링하여 원하는 패킷 수집하기

ip.addr == 202.30.0.19

Wireshark는 현재 접속된 수많은 사이트들에 대한 패킷들을 동시에 수집하는데, 그 중 패킷 분석에 필요한 수신 ip를 지정해서 필터링된 패킷만 수집하였습니다.

수집된 패킷들을 확인하면 클라이언트와 서버 간에 TCP 연결이 성립한 후 HTTP를 통해 메시지를 주고받는 것을 확인할 수 있습니다. HTTP는 TCP를 전송 프로토콜로 사용하기 때문에, TCP 연결 및 해제 과정과 HTTP 데이터 전송 과정이 이루어집니다.

패킷의 내용을 살펴보면 아래와 같습니다.

TCP Connection

tcp_connection

송신 포트(client)의 number는 랜덤으로 생성된 59453번이고 수신 포트(server)는 http 프로토콜의 포트 번호인 80번인 것을 확인할 수 있습니다.

TCP Connection은 3개의 메시지가 교환되는 3-way handshake 방식을 통해 이루어집니다.

  1. 먼저 client가 tcp 연결을 요청하는 SYN 패킷을 전송하여 자신의 연결 준비 상태를 server로 보내줍니다.
  2. server가 client의 연결 요청에 ACK하고 자신의 연결 준비 상태도 SYN하여 알려줍니다.
  3. client가 server의 SYN 수신에 대한 ACK를 보내 TCP Connection이 완료되었습니다.

HTTP Request/Response 메시지 교환

HTTP Request

HTTP Response

TCP 연결이 완료되면 클라이언트는 서버에 HTTP 메시지를 요청합니다. 서버는 클라이언트의 HTTP 요청에 대한 응답을 보낸 후, 전송을 시작합니다. 이때 패킷이 크다면 하나의 패킷 덩어리를 단편화하여 전송하게 됩니다.

HTTP 응답 패킷을 확인해보면 헤더와 본문 정보를 쉽게 볼 수 있으며, Line-based text data 항목에서 HTML이 평문으로 전송된 것을 확인할 수 있습니다. 이렇게 데이터가 암호화되지 않고 평문으로 전송되는 경우, 특히 사용자 인증과 세션 관리와 관련된 중요한 데이터가 노출될 가능성이 있어 주의가 필요합니다. HTTP를 사용하는 경우에는 이러한 보안 문제를 꼭 고려하고 HTTPS와 같은 보안 프로토콜을 활용하여 데이터를 안전하게 전송해야 합니다.

TCP Connection termination

마지막으로 TCP 연결이 해제되면서 HTTP 통신이 종료됩니다.

tcp_termination

  1. client는 이전에 server로부터 받은 데이터를 잘 수신하였다는 ACK와 모든 데이터 전송이 끝났으며 연결 종료에 대한 요청(FIN)을 합니다.
  2. client가 수신할 데이터는 없지만 server는 계속 통신할 데이터가 있기 떄문에 connection을 유지하고 ACK 메시지만 전송합니다.
  3. server가 FIN 메세지를 수신하였고(ACK) 더 이상 처리할 데이터가 없다는 FIN 메세지를 전송합니다.
  4. client가 server의 FIN 메시지를 정상적으로 받았다는 ACK를 보내며 TCP Connection이 끊어지고 server와 client가 connection을 위한 리소스를 회수합니다.

HTTPS 분석

이번에는 HTTPS 통신에서 어떤 동작이 일어나는지 살펴보겠습니다.

HTTPS는 서버와 클라이언트간 데이터를 주고 받게 해주는 HTTP 프로토콜에 데이터 암호화가 추가된 프로토콜입니다. 이 때 보안을 위한 프로토콜로 TLS를 사용합니다. HTTPS의 클라이언트/서버 연결은 TCP 3-way handshake와 다른 방식으로 이루어집니다.

TLS Handshake 과정에서 클라이언트는 서버의 인증서를 받아오고 신뢰할 수 있는 서버라면 클라이언트의 대칭키를 서버의 공개키를 이용해 암호화하여 전달합니다. 서버는 다시 대칭키로 암호화를 하여 서로 데이터를 주고 받게됩니다.

IP 필터링하여 원하는 패킷 수집하기

ip.addr == 202.30.0.19 && tls

먼저 HTTP와 마찬가지로 패킷 분석에 필요한 수신 IP와 해당 프로토콜을 지정해서 필터링된 패킷만 수집합니다.

TLS Handshake

먼저 패킷 분석에 필요한 수신 ip와 TLS 프로토콜을 지정해서 필터링된 패킷만 수집합니다.

tls-setup

  1. client hello: client가 server에 연결을 시도할 때 "client hello" 메시지를 통해 암호 정보(TLS 버전, 암호화 방식, 세션 id 등)를 전송합니다.
  2. server hello: server는 "server hello"를 전송하여 서버의 암호 정보를 클라이언트로 보냅니다.
  3. certificate: server는 또한 "certificate" 메시지를 전송하여 서버의 인증서를 클라이언트에게 보냅니다.
  4. server Key Exchange: server가 공개키를 생성하여 클라이언트에 전송합니다.
  5. server hello done: 서버가 메시지를 모두 보냈으면 "server hello done"을 전송합니다.
  6. client Key Exchange: client가 대칭키를 생성하여 서버의 공개키를 이용해 암호화한 뒤 서버에 전송합니다.
  7. Finished: 성공적으로 handshake가 이루어졌음을 알리고 데이터 교환이 이루어집니다.

TLS 핸드셰이크 과정에서 클라이언트와 서버는 메시지를 교환하여 서로를 인식하고 암호키를 통해 서로를 검증하는 과정을 거치게 됩니다. 따라서 누군가 중간에서 데이터를 가로채거나 공격할 수 없어 안전한 통신을 할 수 있습니다.

tls-data

서버와 클라이언트가 주고 받은 데이터 정보를 확인해보면 패킷이 암호화되어 client가 요청한 리소스, 브라우저 유입 경로 등에 대한 정보를 확인할 수 없다는 것을 알 수 있습니다.

정리

HTTP와 HTTPS는 서버와 클라이언트 간의 데이터 교환을 담당하는 프로토콜입니다. 그러나 두 프로토콜 간에 중요한 차이가 있습니다. HTTP는 데이터를 평문으로 전송하기 때문에 데이터의 내용을 가로채서 확인할 수 있습니다. 이는 보안적으로 취약한 면을 가지고 있습니다. 반면에 HTTPS는 SSL 또는 TLS 프로토콜을 사용하여 데이터를 암호화하고, 서버와 클라이언트 간의 안전한 핸드셰이크를 수행한 후에 데이터 교환이 이루어집니다. 이로써 중간에서 패킷을 가로채더라도 데이터를 해독하기가 매우 어려워집니다. HTTPS를 사용하면 데이터를 안전하게 전송할 수 있으며, 인증 단계를 거치지 않으면 패킷을 열람할 수 없어 보안성을 크게 향상시킵니다.

참고

Wireshark Docs
TLS 핸드셰이크의 원리는 무엇일까요?

profile
좋은 코드를 작성하는 것에 관심이 많은 프론트앤드 개발자입니다. 🏠 블로그 이사 hyeewooon.tistory.com

0개의 댓글