HTTP와 HTTPS에 대해 알아봤었음 ( 참고 링크 )
HTTPS 동작 과정에서 서버는 클라이언트가 요청을 보낼 때
서버는 암호화를 하기 위한 공개키를 생성해야 하는데,
일반적으로는 인증된 기관 CA(Certificate Authority) 에 공개키를 전송하여 인증서를 발급 받고 있음
즉, HTTPS는 클라이언트와 서버간의 통신을 제3자가 인증을 해주어야 함
이러한 CA는 SSL 인증서를 기준으로 클라이언트가 접속한 서버가 맞는지 확인해줌
SSL 인증서
클라이언트와 서버간의 통신을 제3자가 보증해주는 전자화된 문서를 말함
인증서를 통해 클라이언트가 접속한 서버가 신뢰할 수 있는 서버인지 판단하고
SSL 통신에 사용될 공개키를 클라이언트에게 전달하는 역할을 함
SSL 인증서로 서버가 신뢰할 수 있는지 판단하기 위해서 공개키 서명 방식을 사용하는데
이때 방식을 SSL/TLS Handshake 라고 함
SSL/TLS Handshake
HTTPS에서 클라이언트와 서버간의 통신 전에 SSL 인증서로 신뢰성 여부를 판단하기 위한 연결 방식
동작 과정
1) Client Hello
클라이언트는 서버에게 "client hello" 메시지를 암호화된 정보와 함께 전송
이때 암호화된 정보에는 버전, 암호 알고리즘, 압축 방식, 등을 담음
2) Server Hello
서버는 클라이언트가 보낸 암호 알고리즘, 압축 방식 을 받는다.
그 후, 세션 ID, CA 공개 인증서 를 "server hello" 메시지와 함께 담아 클라이언트에게 응답
이 CA 인증서에는 앞으로 HandShake(연결) 이후에 사용할 대칭키가 생성되기 전,
클라이언트에서 HandShake 과정 속 암호화에 사용될 공개키를 담고 있음
3) 인증
클라이언트 측은 서버에서 보낸 CA 인증서에 대해 유효한 지 CA 목록에서 확인하는 과정을 진행
4) 예비 마스터 암호
CA 인증서에 대한 신뢰성이 확보되었다면, 클라이언트는 난수 바이트를 생성하여 서버의 공개키로 암호화
이 난수 바이트는 대칭키를 정하는데 사용이 되고, 앞으로 서로 메시지를 통신할 때 암호화하는데 사용 됨
5) 개인키 사용
만약 2번 단계에서 서버가 클라이언트 인증서를 함께 요구했다면,
클라이언트의 인증서와 클라이언트의 개인키로 암호화된 임의의 바이트 문자열을 함께 보내줌
6) 세션 키 생성
서버는 클라이언트의 인증서를 확인 후, 난수 바이트를 자신의 개인키로 복호화 후 대칭 마스터 키 생성에 활용
7) 클라이언트 준비 완료
클라이언트는 handshake 과정이 완료되었다는 finished 메시지를 서버에 보내면서,
지금까지 보낸 교환 내역들을 해싱 후 그 값을 대칭키로 암호화하여 같이 담아 보내줌
8) 서버 준비 완료
서버도 동일하게 교환 내용들을 해싱한 뒤 클라이언트에서 보내준 값과 일치하는 지 확인
일치하면 서버도 마찬가지로 finished 메시지를 이번에 만든 대칭키로 암호화하여 보냄
9) 안전한 대칭 암호화 성공
클라이언트는 해당 메시지를 대칭키로 복호화하여 서로 통신이 가능한 신뢰받은 사용자란 걸 인지하고,
앞으로 클라이언트와 서버는 해당 대칭키로 데이터를 주고받을 수 있게 됨
요약하자면,
- 서버는 CA에 사이트 정보와 공개 키를 전달하여 인증서를 받음
- 클라이언트는 브라우저에 CA 공개 키가 내장되어 있다고 가정
- ClientHello(암호화 알고리즘 나열 및 전달)
- ServerHello(암호화 알고리즘 선택)
- Server Certificate(인증서 전달)
- Client Key Exchange(데이터를 암호화 할 대칭 키 전달)
- Client / ServerHello done (정보 전달 완료)
- Finished(SSL Handshake 종료)
+
Client Hello
- Client가 Server에 연결을 시도하며 전송하는 패킷
- 사용 가능한 Cipher Suite 목록, Session ID, SSL 프로토콜 버전, Random Byte 등을 전달
Server Hello
- 서버는 클라이언트가 보내 온 ClientHello 패킷을 받아 Cipher Suite 중 하나를 선택한 다음 클라이언트에게 이를 알림
- 자신의 SSL 프로토콜 버전 등도 같이 보냄
Certificate
- 서버가 자신의 SSL 인증서를 클라이언트에게 전달
- 인증서 내부에는 서버가 발행한 공개키가 포함되어있음
Server Key Exchange / ServerHello Done
- 서버의 공개 키가 SSL 인증서 내부에 없는 경우
- 서버가 직접 전달
- 공개 키가 SSL 인증서 내부에 있을 경우 Key Exchange는 생략
Client Key Exchange
- 클라이언트는 데이터 암호화에 사용할 대칭 키를 생성한 후 SSL 인증서 내부에서
추출한 서버의 공개 키를 이용해 암호화한 후 서버에게 전달
ChangeCiptherSpec / Finished
- ChangeCipherSpec 패킷은 클라이언트와 서버 모두가 서로에게 보내는 패킷
- 교환할 정보를 모두 교환한 뒤 통신할 준비가 다 되었음을 알리는 패킷
- Finished 패킷을 보내어 SSL Handshake를 종료하게 됨
Reference Path
'CS' 카테고리의 다른 글
Blocking, NonBlocking + Synchronous, Asynchronous (0) | 2022.11.24 |
---|---|
로드밸런싱 Load Balancing (0) | 2022.11.20 |
GET과 POST 방식 (0) | 2022.11.13 |
대칭키와 비대칭키(공개키) (0) | 2022.11.13 |
HTTP와 HTTPS (0) | 2022.11.13 |