HTTPS (HTTP Secure)는 HTTP 프로토콜의 암호화된 버전이다. 클라이언트와 서버 간에 네트워크로 데이터를 전송하기 전에 안전하고 암호화된 연결을 설정한다. HTTPS는 HTTP 요청 및 응답을 SSL 및 TLS 기술에 결합한다.
https://
로 시작한다.암호화 Encryption
데이터를 알아볼 수 없는 모습으로 변경하여 감추는 것. HTTPS에서는 후술할 'Key'들을 이용하여 데이터를 암호화함.
복호화 Decryption
암호화된 데이터를 해독이 가능한 평문 데이터로 되돌리는 것을 복호화라고 함. HTTPS에서는 후술할 'Key'들을 이용하여 데이터를 복호화함.
Key
HTTPS에서는 Key가 없으면 데이터 암호화, 복호화가 불가능함.
공개키 Public Key : 공개 가능한 키. 암호화 과정에 참여하는 브라우저, 서버 같은 Key 발행자 뿐만 아니라 누구든 알아도 상관없는 존재. 개인키와 쌍을 이루어 존재함 보통 데이터를 암호화하는데 사용. 개인키로 암호화된 데이터는 공개키로 복호화할 수 있음, 공개키로 암호화를 하면 데이터 보안에 중점을 두는 것이다.
개인키 Private Key : 오로지 Key 발행자만이 갖는 키. 공개키와 쌍을 이루어 존재. 보통 데이터를 복호화하는데에 사용. 암호화도 가능함. 개인키로 암호화를 하면 인증 과정에 중점을 두는 것이다.
대칭키 Symmetric Key : 위의 공개키/개인키처럼 암호화/복호화에 각기 다른 키를 사용하는 것이 아닌 암호화/복호화에 동일한 하나의 키를 사용.
TLS Handshake의 과정을 그린 그림. 파란색과 노란색은 네트워크 상에서 전달되는 IP Packet을 표현한 것이다, 맨 윗줄의 SYN, SYN ACK, ACK는 TCP Layer의 3-way handshake로 HTTP가 TCP/IP 기반의 프로토콜이기 때문에 암호화 협상(SSL Handshake)에 앞서 연결을 생성하기 위해 실시하는 과정이고 아래 노란색 상자의 패킷들이 TLS Handshake임.
SSL은 원래 HTTP용으로 개발된 암호화 프로토콜이었다. SSL은 오래 전에 전송 계층 보안(TLS)으로 대체되었음. SSL이라는 이름이 아직도 널리 사용되지만 이제는 TLS 핸드셰이크라고 불림.
TLS 핸드셰이크는 사용자가 HTTPS를 통해 웹을 탐색하고 브라우저가 처음 해당 웹 사이트의 원본 서버를 요청하기 시작할 때마다 발생한다. 다른 통신이 API 호출 및 HTTPS를 통한 DNS 요청을 포함하는 HTTPS를 사용할 때에도 발생한다.
TLS 핸드셰이크는 TCP 연결로 TCP 핸드셰이크를 통해 열린 후에 발생함.
클라이언트가 서버로 Hello! 메세지를 전송하면서 핸드셰이크를 개시함.
클라이언트가 서버에 연결을 시도하며 전송하는 패킷이다. 자신이 사용 가능한 Cipher Suite 목록, Session ID, SSL 프로토콜 버전, Random Byte 등을 전달한다. Cipher Suite는 SSL 프로토콜 버전, 인증서 검정, 데이터 암호화 프로토콜, Hash 방식 등의 정보를 담고 있는 존재로, 선택된 Cipher Suite의 알고리즘에 따라 데이터를 암호화하게 된다.
클라이언트가 사용 가능한 Cipher Suite를 서버에 제공하는 것을 알 수 있다.
Ciper Suite 구성
암호화 협상을 위한 알고리즘을 모아둔것.
서버는 클라이언트가 보내온 ClientHello 패킷을 받아 CipherSuite 중 하나를 선택한 다음 클라이언트에게 이를 알린다. 또한 자신의 SSL 프로토콜 버전 등도 같이 보낸다.
서버가 자신의 SSL 인증서를 클라이언트에게 전달한다. 인증서 내부에는 서버가 발행한 공개키가 들어있다. 클라이언트는 서버가 보낸 CA(Certificate Authority, 인증 기관)의 개인키로 암호화된 SSL 인증서를 공개키를 사용하여 복호화한다.
아래 처럼 암호화 알고리즘을 확인할 수 있음.
서버의 공개키가 SSL 인증서 내부에 없는 경우, 서버가 직접 전달한다는 뜻. 공개키가 SSL 인증서 내부에 있을 경우 Server Key Exchange는 생략.
인증서 내부에 서버의 공개키가 있다면, 클라이언트가 CA의 공개키를 통해 인증서를 복호화한 후 서버의 공개키를 확보할 수 있다. 이후 서버가 행동을 마쳤음을 전달한다.
클라이언트는 데이터 암호화에 사용할 대칭키를 생성한 후 SSL 인증서 내부에서 추출한 서버의 공개키를 이용해 암호화한 후 서버에게 전달한다. 여기서 전달된 대칭키가 TLS Handshake의 목적이자 가장 중요한 수단인 데이터를 실제로 암호화할 키임. 이제 키를 통해 클라이언트와 서버가 실제로 교환하고자 하는 데이터를 암호화한다.
ChangeCiperSpec 패킷은 클라이언트와 서버 모두가 서로에게 보내는 패킷으로, 교환할 정보를 모두 교화한 뒤 통신할 준비가 다 되었음을 알리는 패킷이다. 그리고 Finished 패킷을 보내어 TLS Handshake를 종료하게 된다.
저도 지금 HTTPS나 SSH 같은 프로토콜에서 사용하는 보안 방식에 대해 공부하고 있는데 너무 잘 정리된 글인 것 같아요 짱짱!!!