운영하는 웹서비스(https://github.com/boostcamp-2020/Project04-C-Whale)에 HTTPS 를 적용하기 전에 HTTPS 의 개념과 작동 방식을 정리하고자 한다.
HTTPS
- HTTP Secure 혹은 HTTP over SSL/TLS
- HTTP와 달리 HTTPS는 전송 데이터를 암호화한다.
HTTPS의 장점
- 통신하고자 하는 서버가 신뢰할 수 있는 서버인지 판별할 수 있다.
- 통신 과정에서 데이터가 노출될 가능성이 적다.
SSL(Secure Sockets Layer) / TLS(Transport Layer Security)
- HTTPS는 암호화를 위해 SSL/TLS 프로토콜을 사용한다
- TLS는 SSL을 계승하며, SSL은 deprecated 되었다.
- 두 명칭을 혼용해서 사용하는 것 같다.
SSL 인증서
SSL 프로토콜에 사용되는 인증서
역할
- 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보증한다.
- 통신에 사용할 공개키를 클라이언트에 전달한다.
포함 내용
- 서비스 정보(CA 정보, 도메인 등)
- 서버 측 공개키
CA(Certificate Authority)
- 위 인증서를 발급해주는 제 3자이다.
- 브라우저는 신뢰할 수 있는 CA(공인 CA)들과 해당 CA의 공개키를 알고있다.
SSL 동작원리 - 암호화 방식
대칭키 방식
- 암호화와 복호화를 동일한 하나의 키(대칭키)로 하는 방식이다.
- 암호 통신을 하기 위해선 대칭키를 주고 받아야 하기 때문에 키가 유출될 가능성이 있다.
공개키 방식
- 두개의 키(공개키, 비밀키)로 암호화 및 복호화하는 방식.
- 공개키로 암호화 -> 비밀키로 복호화 / 비밀키로 암호화 -> 공개키로 복호화
SSL은 대칭키, 공개키를 함께 사용한다
- 공개키 방식은 보안이 뛰어나지만 암호화/복호화에 컴퓨팅파워가 많이 든다.
- 따라서 데이터 전달에는 대칭키를 쓰고, 그 대칭키를 교환할 때는 공개키 사용한다.
SSL 동작원리 - Handshake 과정
1. Client -> Server
Client hello 라고 불린다. 다음과 같은 데이터를 서버에 전송한다.
- 클라이언트가 생성한 랜덤 데이터
- 클라이언트가 지원하는 암호화 방식
- Session Id (이미 SSL handshake를 한번 완료했다면 기존 session 재활용)
2. Server -> Client
Server hello 라고 불린다. 다음과 같은 데이터를 클라이언트에 전송한다.
- 서버가 생성한 랜덤 데이터
- 서버가 선택한 암호화 방식
- CA의 비밀키로 암호화 된 SSL 인증서
3. Client -> Server
-
클라이언트는 먼저 인증서를 발행한 CA를 신뢰할 수 있는지 판단한다 (갖고 있는 CA 리스트와 비교).
-
진짜 그 CA가 발행한 인증서가 맞는지 확인한다.
- 기존에 갖고 있는 CA의 공개키를 사용해 인증서를 복호화 한다.
- 복호화에 성공한다면, 신뢰 할 수 있는 CA가 보증한 서버임을 확신할 수 있다.
- 공개키 방식을 거꾸로 사용해 Authentication에 활용했다고 할 수 있다.
-
이후 Client hello 의 랜덤 데이터와 Server hello 의 랜덤 데이터를 조합하여 pre master key 생성한다.
-
pre master key를 암호화(인증서에 포함된 서버측 공개키 사용)하여 서버에 전송한다.
4. Pre master key를 session key로 변환
- 서버는 자신의 비밀키로 전달받은 pre master key를 복호화한다.
- 클라이언트와 서버 모두 일련의 과정을 거쳐 세션 키를 획득한다.
( pre master key -> master key -> session key )
- 이후 세션 키를 대칭키로 사용해 데이터를 암호화 하여 클라이언트-서버 통신이 이루어진다.
5. Handshake 종료
참고
https://opentutorials.org/course/228/4894
https://en.wikipedia.org/wiki/Transport_Layer_Security