> For the complete documentation index, see [llms.txt](https://guswns3371.gitbook.io/study/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guswns3371.gitbook.io/study/readme/network/ssl-handshake.md).

# SSL handshake, 대칭키 & 비대칭키

## 대칭키(비밀키) 암호화 방식

하나의 키로 데이터를 암호화 및 복호화하는 방식이다

* 장점
  * 암복호화에 드는 비용이 적다.
  * 속도가 빠르다
* 단점
  * 대칭키가 노출되면 보안상 치명적인 문제가 발생한다
  * 대칭키를 전달하는 과정이 어렵다 → 대칭키을 안전하게 전달하기 위해 “비대칭키” 방식이 등장

## 비대칭키(공개키) 암호화 방식

두 개의 키로 데이터를 암호화 및 복호화하는 방식이다

* 두 개의 키 : 공개키, 개인키
  * 공개키로 암호화하면 개인키로만 복호화할 수 있다. → `데이터를 암호화하여 보호하기 위한 목적`
  * 개인키로 암호화하면 공개키로만 복호화할 수 있다. → `인증의 목적`
* 장점
  * 보안성이 좋다
* 단점
  * 구현이 어렵다
  * 속도가 느리다

## 대칭키 + 비대칭키 혼합 방식

대칭키는 데이터 암호화하기 위해 사용하고, 비대칭키는 대칭키를 안전하게 전달하기 위해 사용한다.

## SSL(Secure Socket Layer)

웹 사이트와 웹 브라우저 혹은 두 서버 사이에서 주고 받는 데이터를 암호화를 담당하는 계층이다.

* OSI 7계층과 4계층 사이에 위치해 있다.
* TCP보다 상위 계층에 있으므로 TCP 기반의 모든 어플리케이션에서 SSL 계층이 적용될 수 있다. (HTTP 전용으로만 사용되지 않는다.)
  * FTP over SSL, SMTP over SSL

## SSL Handshake

클라이언트와 서버가 암호화 통신을 하기위해 서로의 신분을 확인하고, 필요한 정보를 교환하는 과정이다.

1. 서버는 `CA(Certificate Authority)`에게 인증 요청을 한다 (자신의 정보와 공개키를 전달)
2. CA는 CA의 개인키로 `서버의 정보` + `서버의 공개키`를 암호화하여 `서버의 CA 인증서`를 생성하고, 이를 서버에게 전달한다
3. 클라이언트는 서버에게 `ClientHello`패킷을 전달하여 접속을 요청한다
   * ClientHello에 `클라이언트에서 사용 가능한 Cipher Suite 목록`, `Session ID`, `SSL 프로토콜 버전`, `Random Byte` 등이 담겨있다.
4. 서버는 `클라이언트의 Cipher Suite 리스트 중 사용할 암호화 알고리즘`과 `서버의 SSL 프로토콜 버전`을 `ServerHello`패킷에 담아 클라이언트에게 알린다
5. 서버는 클라이언트에게 `CA 인증서`를 전송한다 (Certificate)
6. 클라이언트는 브라우저에 내장된 CA 공개키로 CA 인증서를 복호화하여 `서버의 공개키`를 얻는다 (Certificate & ServerHello Done)
7. 클라이언트는 `클라이언트의 대칭키`를 `서버의 공개키`로 암호화하여 서버로 전달한다. (클라이언트 입장 : ChangeCipherSpec, Finished)
8. 서버는 `서버의 개인키` 로 이를 복호화하여 `클라이언트의 대칭키` 를 얻는다. (서버 입장 : ChangeCiperSepc, Finished)
9. 서버와 클라이언트는 각자 전달할 데이터를 `대칭키`로 암복호화하면서 안전하게 통신한다.
