[Network] TLS/SSL HandShake

이민우·2024년 3월 7일

CS_네트워크

목록 보기
7/8

📝 SSL(Secure Sockets Layer)

  • SSL은 컴퓨터 네트워크에 통신 보안을 제공하는 프로토콜(계층)이다.
  • TLS(Transport Layer Security)라는 이름은 SSL이 표준화 되면서 바뀐 이름이다.
  • SSL은 클라이언트가 서버가 주고 받는 통신 데이터에 대한 도청, 간섭, 위조를 방지해준다.
  • 또한 데이터를 암호화 해주기 때문에 클라이언트 서버가 안전한 통신을 할 수 있게 해준다.

📌 TLS/SSL HandShake 과정

  • SSL 통신 과정은 “SSL 핸드셰이크” - “Session” - “Session 종료” 순으로 진행된다.
  • HTTPS 통신 과정을 그림과 함께 차례대로 살펴보자. (HTTPS는 SSL 위에서 동작하는 HTTP다.)

SSL 핸드셰이크(1번~6번

  • 먼저 서버와 클라이언트는 어떤 암호화 알고리즘을 사용할지 결정한다.
  • 결정이 됐으면, 암호화 알고리즘을 사용해서 대칭키를 만들고 서로 나누어 가진다.

1번 : Client Hello

  • 클라이언트는 서버에게 클라이언트 측에서 생성한 랜덤 데이터, 클라이언트가 사용 가능한 암호화 알고리즘 후보들을 전송한다.
  • 만약 이전에 서버와 SSL 핸드셰이킹을 진행했다면, 기존의 세션을 재활용하기 위해 세션 키를 전송한다.

2번 : Server Hello

  • 서버는 클라이언트가 보낸 암호화 알고리즘 후보들 중 사용 가능한 알고리즘을 선택한다.
  • 서버는 클라이언트에게 서버 측에서 생성한 랜덤 데이터, 선택한 암호화 알고리즘, 인증서를 전송한다.

3번 : 인증서 검증 및 대칭키 생성

  • 클라이언트는 서버로부터 받은 인증서(전자서명)가 CA에 의해서 발급된 것인지 확인하기 위해 클라이언트 측에 저장된 CA의 공개키로 인증서를 검증한다.
  • 검증이 성공했다면, 해당 서버가 CA로부터 인증 받았다는 것이 보장된다. 서버를 믿을 수 있게 된 것이다.
  • 클라이언트는 클라이언트 측에서 생성한 랜덤 데이터와 서버 측에서 생성한 랜덤 데이터를 사용해서 pre master secret라는 대칭키를 만든다.
  • pre master secret는 클라이언트와 서버의 암호화 통신에 사용될 대칭키다.

4번 : pre master secret를 서버에게 전송

  • 클라이언트는 pre master secret를 안전하게 암호화해서 서버에게 전달 해야 한다.
  • 어떻게 할까? 그것은 바로 인증서에 들어있던 서버의 공개키로 암호화해서 전달하는 것이다. (인증서에는 서버의 공개키가 원래 들어있다.)

5번 : pre master secret 수신

  • 서버는 자신의 개인키로 pre master secret를 복호화해서 얻어낸다.

6번 : master secret 및 session key 생성

  • 서버와 클라이언트는 일련의 과정을 거쳐서 pre master secret를 master secret으로 만들고 master secret으로 session key를 생성한다.

Session (7번)

7번 : session key를 통한 대칭키 암호화 방식 통신

  • 세션은 실제로 서버와 클라이언트가 데이터를 주고 받는 단계다.
  • 데이터를 상대방에게 전송하기 전에 session key를 사용해서 대칭키 방식으로 암호화해서 전송한다.
  • 암호화된 데이터를 받은 상대방은 동일 session key를 사용해서 데이터를 복호화할 수 있다.

End Session (8번)

8번 : 세션종료 및 Session Key 폐기

  • 데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려준다. 이 때 통신에서 사용한 대칭키인 세션키를 폐기한다.

참고

https://opentutorials.org/course/228/4894
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Network/TLS%20HandShake.md

profile
백엔드 공부중입니다!

0개의 댓글