본문 바로가기

Https

원숭이도 읽으면 이해할 수 있는 https2

생활코딩 님의 https 수업을 듣고 복습 및 추후 상기 목적으로 정리한 내용입니다.
제 생각대로 적어놓은 것도 있습니다.. 조심하세요!
https://opentutorials.org/course/228/4894

SSL과 암호화

그러면 이번에는 SSL이 무엇인지, 어떻게 사용되는지 알아보겠다.

SSL은 데이터 암호화 및 복호화를 위해 사용하며,

암•복호화는 특정 key를 통해서 이루어진다.

이 때 key를 어떻게 사용하냐에 따라서 대칭키와 공개키(비대칭키) 방식 2개로 나눠진다.

대칭키 방식

  • 암호화 및 복호화가 하나의 key를 통해 진행된다.
  • key가 하나이고, 유출될 경우 누구나 암•복호화가 가능하게 된다.

공개키 방식

  • 공개키와 개인키 2개의 key를 사용하는 기법이다.
    공개키는 누구에게나 공개되는 key이며, 개인키는 유출되어서는 안 되는 key이다.
  • 공개키로 암호화할 경우 개인키로만 복호화가 가능하며,
    개인키로 암호화할 경우 공개키로만 복호화가 가능하다.

SSL 인증서와 CA(Certificate Authority)

SSL을 통해서 어떻게 웹 브라우저는 서버가 안전하다고 보장할까?
실제로 웹브라우저에서 SSL이 어떻게 동작하는지 전체적인 흐름을 알아보자!

일단 이번 단락에서는 공개키를 사용하여 인증서를 암•복호화하고 있다는 것을 생각하자!

 

CA는 SSL 인증서를 발급해주는 기관으로, 브라우저마다 CA List가 내장되어있다.
만약 사이트가 사용 중인 SSL 인증서가 내장된 CA List 중 한 곳에서 발급된 것이 확인되면,
해당 사이트는 안전하다고 인정받게 된다.

인증과정 흐름 살펴보기

  1. 웹 브라우저(client)는 https가 적용된 사이트에 접속 후 서버로부터 SSL 인증서를 받는다.
  2. 웹 브라우저는 인증서를 자신이 인정한 CA로부터 발급받았는지 확인한다.
  3. 만약 2번이 확인된다면, CA로부터 공개키를 얻어와 인증서를 복호화한다.
    (부연 - 서버는 자신의 개인키를 통해 인증서를 암호화해놓는다.
    '공개키 방식에서 개인키를 통해 암호화할 경우 공개키로만 복호화가 가능하다'
    라는 규칙에 의해 CA로부터 얻어온 공개키로 복호화에 성공한다면,
    서버는 해당 CA에서 인증서를 발급받았다는 것이 증명되는 것이다.
    최종적으로 웹 브라우저는 접속한 서버의 신뢰성을 보장할 수 있게 된다.)
  4. 복호화에 성공하면, 해당 인증서에 등록된 사이트 정보와
    접속 중인 사이트 정보를 비교한다.
  5. 사이트 정보가 일치하면 해당 사이트의 안전성이 인정된다.

(위 인증과정에는 생활코딩님 강의를 듣고 제 생각 + 이해가
편한대로 해석해 정리해놓은 점을 밝힙니다.
혹시라도 틀린 점이 있다면 알려주세요!
웹 브라우저와 클라이언트가 같은 것은 아니지만,
이해를 편하게 하기 위해 웹 브라우저로 썼습니다~)

정리하면 SSL 인증서는 크게 2개의 역할을 한다.

  1. 클라이언트에게 공개키 제공
  2. 클라이언트가 접속한 서버의 신뢰성 보장

SSL을 웹사이트에 적용할 때 어느 방식이 맞을까?

대칭키 방식

클라이언트와 서버가 데이터를 암•복호화할 때 key를 사용해야 하는데,
이 때 하나뿐인 key가 유출된다.

이로 인해 대칭키 방식에서는 유출된 key를 통해 누구나 암복호화를 할 수 있게 된다.

=> 대칭키 방식으로는 웹사이트 보안을 보장할 수 없게 된다.

 

공개키 방식

먼저 클라이언트와 서버는 각자의 공개키를 서로 공유한다.

그 후 데이터를 주고 받을 때는 다음과 같은 과정을 거친다.

 

1. 클라이언트 → 서버

  • 클라이언트는 서버의 공개키로 데이터를 암호화하여 서버에게 보낸다..
  • 서버는 자신의 비밀키로 받은 정보를 복호화한다.

2. 서버 → 클라이언트

  • 서버는 클라이언트의 공개키로 데이터를 암호화하여 클라이언트에게 보낸다..
  • 클라이언트는 자신의 비밀키로 받은 정보를 복호화한다.

=> 공개키 방식은 안전하지만, 너무 많은 컴퓨팅 파워를 요구하여 웹페이지가 무거워진다.

 

SSL 방식은 대칭키 및 공개키를 혼합하여 사용해서 보안과 성능을 모두 챙긴다.


SSL 동작 방법

이번에는 SSL이 웹에서 동작하는 구체적인 흐름을 살펴볼 것이다!

핵심은 실제 데이터는 대칭키 방식으로 암•복호화하고,
이 대칭키는 공개키 방식으로 안전하게 공유한다는 것이다.
아래 과정이 복잡해 이해가 어렵다면 위 핵심만 기억해도 큰 성과이다!

컴퓨터와 컴퓨터가 네트워크를 통해 통신할 때 크게 3단계를 거친다.
SSL 방식에서도 이 3단계를 거쳐 통신하게 된다.
악수(Handshake) -> 전송 -> 세션종료


1. 악수(Handshake)

Handshaking은 클라이언트와 서버가 서로 파악하기 위해 인사를 하는 과정이다.
여기서 이뤄지는 가장 중요한 일 2가지

    - 서버의 인증서를 클라이언트에 전송

    - 클라이언트와 서버가 각각 처리할 수 있는 암호화기법을 서로 교환

 

  1. Client Hello => 클라이언트가 서버에 접속하고, 아래와 같은  데이터를 전송한다!
    • 클라이언트 측에서 생성한 랜덤 데이터
    • 클라이언트가 지원하는 암호화 방식들
      (클라이언트와 서버가 지원하는 암호화 방식이 서로 다를 수 있다. 때문에 서버와 클라이언트 모두 사용 가능한 암호화 방식 선택을 위해 해당 데이터를 전송하는 것이다.)
    • 세션 아이디 - 몰라도 된다. 궁금한 사람들은 검색하자!
  2. Server Hello - ClientHello에 대한 응답으로 Server는 아래와 같은 데이터를 전송한다!
    • 서버 측에서 생성한 랜덤 데이터
    • 서버가 선택한 클라이언트의 암호화 방식
      (클라이언트의 암호화 방식 중 자신이 처리할 수 있는 것과 가장 안전한 것을 선택함)
    • 클라이언트에게 인증서 전송
  3. 클라이언트는 서버의 인증서가 어떤 CA에 의해 발급된 것인지 확인 후 클라이언트에 내장된 CA 리스트에  있는지 없는지 체크한다.
    내장된 CA 리스트에 있다면 해당 CA로부터 공개키를 얻어와 복호화를 시도한다.

    복호화에 성공한다면 해당 CA에서 발급받은 인증서라는 것이 인증되고, 인증서를 전송한 서버를 믿을 수 있게 된다.
    (해당 과정은 윗부분의 SSL 인증서와 CA에 구체적으로 설명되어 있다.)

    그리고 Client Hello에서 전송했던 랜덤데이터와 Serve Hello에서 받았던 랜덤데이터를
    조합해서 pre master secret 값을 만든다.
    생성한 pre master secret 값을 서버의 공개키를 통해  암호화한 후 서버에 전송한다.
    서버의 공개키는 인증서에서 얻어온 것이다.
    (이제 pre master secret은 서버와 클라이언트만이 공유하는 값이 되었다.)
  4. 서버와 클라이언트는 일련의 과정을 통해 pre master secret 값을 master secret 값으로 만든다.
    최종생성된 master secret을 통해 session key를 생성한다.
    이 과정을 통해 서버와 client는 session key를 안전하게 공유한다.
    이제 나중에 데이터를 주고 받을 때에는 session key를 통해 암•복호화한다.
  5. 클라이언트와 서버는 핸드쉐이크 단계의 종료를 서로에게 알린다.

2. 전송(Session)

session key를 사용하여 데이터를 암•복호화하며 데이터를 주고 받는다.

즉, session key를 대칭키로 사용하는 것인데,
session key를 서로 공유할 때 공개키를 통해 철저하게 외부로 노출되는 것을 막았기때문에
session key(대칭키)의 노출될 걱정 없이 사용할 수 있다.

 

3. 세션 종료

데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알리고 session key는 폐기한다.

 

제목은 어그로다... 이 글만 이해하고 읽기에는 힘들 것이다! 그래도 이 글이 도움이 되길 바란다 ㅠㅠ 😀