HTTPS(Hypertext Transfer Protocol Secure)는 HTTP 프로토콜로 통신 할 때 데이터를 암호화하여 보내는 프로토콜입니다.
HTTPS에서 데이터는 Transport Layer Security(TLS)를 사용하여 암호화되어 전송됩니다.
누군가 wireshark와 같은 패킷 분석 툴로 데이터를 가로채도 암호화된 이진 코드기 때문에 보안적으로 안전합니다.
완전히 읽을 수 있는 텍스트 문자열입니다
ITM0IRyiEhVpa6VnKyExMiEgNveroyWBPlgGyfkflYjDaaFf/Kn3bo3OfghBPDWo6AfSHlNtL8N7ITEwIXc1gU5X73xMsJormzzXlwOyrCs+9XCPk63Y+z0=
클라이언트 -> 서버: 클라이언트가 SYN 패킷을 보냅니다. 클라이언트가 연결을 설정하고자 한다는 것을 서버에 알립니다.
서버 -> 클라이언트: 서버는 SYN을 받았다는 신호로 ACK(Acknowledge)를 보냅니다. 클라이언트는 ACK을 받으면 서버에 연결하고 서버가 연결을 수락하지 않는다면 SYN-ACK 대신 RST(Reset) 패킷을 보내 연결을 거부합니다.
클라이언트 -> 서버: 클라이언트는 서버의 ACK를 받았다는 신호로 다시 ACK를 보냅니다. TCP 연결이 설정되어 Handshake가 이뤄집니다.
클라이언트는 서버에게 "client hello" 메시지를 보냅니다.
메시지에는 암호화 알고리즘과 지원 가능한 최신 TLS 버전이 포함됩니다.
서버는 클라이언트에게 받은 암호화 알고리즘과 TLS 버전을 지원할 수 있는지 여부를 클라이언트에게 응답합니다.
서버는 SSL 인증서를 클라이언트에게 보냅니다.
인증서에는 공개 키, 호스트 이름, 만료 날짜 등이 포함됩니다.
클라이언트는 SSL 인증서를 확인한 후 클라이언트는 세션 키를 생성하고 공개 키를 사용하여 이를 암호화합니다.
세션 키는 일시적으로 생성되며 현재의 통신 세션 동안만 사용됩니다.
서버는 암호화된 세션 키를 수신하고 개인 키로 암호화된 세션 키를 복호화합니다.
클라이언트와 서버가 동일한 세션 키를 가지고 있으니 암호화된 데이터는 안전한 양방향 채널을 통해 전송됩니다.
서버가 암호화된 데이터를 다시 클라이언트로 보내면 공개 키를 사용하여 데이터를 해독할 수 있습니다.
공개 키로 암호화된 데이터는 개인 키로만 해독할 수 있고 개인 키로 암호화된 데이터는 공개 키로만 해독할 수 있습니다.
공개키는 클라이언트와 서버 단 둘만 알고 있기 때문에 안전한 통신이 가능합니다.
비대칭 암호화는 상당한 수학적 오버헤드가 발생하여 대용량 데이터를 처리할 때 많이 느려집니다.
HTTPS는 SSL/TLS 프로토콜을 사용하여 데이터를 암호화하고 복호화하기 때문에 추가적인 계산 작업이 발생하여 HTTP에 비해 성능이 떨어집니다.
HTTPS는 TLS Handshake 과정에서 암호화 키를 교환하는데 시간이 걸리고 처음 연결 시에는 Handshake에 시간이 소요되어 HTTP에 비해 성능이 떨어집니다.
HTTP에서는 데이터가 암호화되지 않아 브라우저가 캐싱을 통해 이전에 가져온 리소스를 재사용할 수 있습니다.