Contents

Https

HTTP(Hypertext Transfer Protocal)는 Hypertext인 HTML을 전송하기 위한 통신 규약을 의미한다. HTTPS는 보안이 강화된 HTTP라는 것은 누구나 알고 있을 것이다.

SSL

SSL은 Secure Socket Layer의 약자로 보안 소켓 레이어이다.

Netscape사에서 웹서버와 웹브라우저 간의 보안을 위해 만들어졌고 공개키/개인키 대칭키 기반으로 사용한다.

SSL에서 사용하는 암호화의 종류

대칭키

대칭키는 동일한 키로 암호화와 복호화를 같이 할 수 있는 방식의 암호화 기법을 의미한다.

공개키

대칭키 방식은 암호를 주고 받는 사람들 사이에 대칭키를 전달하는게 어렵다. 이 대칭키가 유출되면 암호의 내용을 복호화 할 수 있기 떄문이다. 이러한 단점 떄문에 나온게 공개키 방식이다.

공개키 방식은 2개의 키를 가진다. public key, private key라고 부른다. private key는 자신만이 가지고 있고 public key를 타인에게 제공한다. public key를 제공받는 사용자는 이 키를 이용해서 암호화된 정보를 복호화 한다.

public key가 유출되더라도 private key를 모르면 정보를 복호화 할 수 없기 때문에 안전하다. (public key로는 암호화 밖에 못함)

이러한 방식으로 응용가능한게 있는데,

private key의 소유자는 private key를 이용해 정보를 암호화 한 후 public key와 같이 암호화된 정보를 전송한다. 정보와 public key를 획득한 사람은 public key를 이용해 암호화 된 정보를 복호화 한다.

이 과정에서 public key가 유출되면 공격자에 의해 데이터가 복호화 될 위험이 있는데, 이것은 데이터를 보호하려는 목적이 아니라 암호화된 데이터를 public key를 가지고 복호화 할 수 있다는 것은 그 데이터가 public key와 쌍을 이루는 private key에 의해서 암호화 되었다는 것을 의미한다. (데이터를 전송해준 사람이 알맞은 private key를 가지고 있다고 인증 되는 것 즉 신원을 보장해주는 것) 이러한 것을 전자 서명이라고 부른다.

SSL 인증서

SSL 인증서는 클라이언트와 서버간의 통신을 제3자가 보증해주는 전자화된 문서다. 클라이언트가 서버에 접속한 직후에는 서버가 클라이언트에게 이 인증서 정보를 전달한다.

  1. 클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장한다.
  2. SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.

CA

인증서의 역할을 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지 보장하는 역할을 하는데, 이러한 역할을 해주는 기업이 CA(Certificate authority) 라고 부른다.

SSL을 통해서 암호화된 통신을 제공하려는 서비스는 CA를 통해서 인증서를 구입해야한다.

물론 개인적으로 인증서를 만들어서 사용할 수도 있지만 브라우저에서 경고가 발생할 것이다.

SSL 인증서에는 다음과 같은 정보가 포홤되어 있다.

  1. 서비스의 정보(인증서를 발급한 CA, 서비스의 도메인 등)
  2. 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)

CA의 리스트는 브라우저에서 알고 있기 때문에 이 CA리스트에 포함되어야지만 공인된 CA가 될 수 있다.

SSL 인증서가 서비스를 보증하는 방법

  1. 웹 브라우저가 서버에 접속할 때 서버는 제일 먼저 인증서를 제공한다.
  2. 브라우저는 이 인증서를 발급한 CA가 자신이 가지고 있는 list에 있는지 확인한다.
  3. 자신이 가지고 있는 CA 리스트에 포함되어 있다면 해당 CA의 공개키를 이용해서 인증서를 복호화 한다.
  4. 위에서 말했듯 CA의 공개키를 이용해서 인증서를 복호화 할 수 있다는 것은 이 인증서가 CA의 private key에 의해서 암호화 된 것을 인증해주는 것이다.
  5. 4번에서 인증해주는 것은 해당 서비스가 신뢰할 수 있다는 것이다.

SSL의 동작방법

SSL은 암호화된 데이터를 전송하기 위해서 공개키와 대칭키를 혼합해서 사용한다. 클라이언트와 서버가 주고 받는 실제 정보는 대칭키 방식으로 암호화 하고, 대칭키는 공개키 방식으로 암호화 해서 클라이언트와 서버가 주고 받는다.

공개키 방식의 암호화는 안전하지만 컴퓨터 자원을 많이 사용한다. 반면에 대칭키는 송신측과 수신층이 동일한 키를 공유해야하기 떄문에 보안상 문제가 발생할 수 있다.

SSL은 이 두개의 장점을 혼합한 방법을 사용한다.

Hadnshake

브라우저와 서버도 handshake를 하는데 이 때 SSL 인증서를 주고 받는다.

  1. 클라이언트가 서버에 접속 (Client Hello)

    • 클라이언트에서 생성한 랜덤 데이터
    • 클라이언트가 지원하는 암호화 방식: 서버와 지원하는 암호화 방식에 클라이언트에서 사용하는 암호화 방식이 없을 수 있기 떄문에 서버측에 리스트를 제공한다.
    • 세션 아이디: handshake 이후 세션을 이용하기 위해 세션 식별자를 서버로 전송
  2. 서버는 Client Hello에 대한 응답으로 Server Hello를 한다.

    • 서버 측에서 생성한 랜덤 데이터
    • 서버가 선택한 클라이언트의 암호화 방식: 클라이언트에서 전달해준 암호화 리스트를 확인해 서버쪽에서도 사용할 수 있는 암호화 방식을 선택해서 클라이언트로 전달
    • 인증서
  3. 클라이언트는 서버의 인증서가 CA에 의해서 발급된 거인지 확인 하기 위해 브라우저에 내장된 CA리스트 확인, 없다면 경고 메세지출력. 브라우저의 CA의 공개키를 이용해서 인증서를 복호화 한다. 복호화에 성공했다면 인증서는 CA의 private key로 암호화 된 것이라고 보증된 것이기 때문에 서버를 신뢰할 수 있게 된다.

클라이언트는 1번과 2번에서 말했던 클라이언트 랜덤데이터와 서버 랜덤데이터를 조합해서 pre master secret이라는 키를 생성한다. 이 키는 뒤에 세션단계에서 데이터를 주고 받을 때 암호화를 하기 위해 사용될 것이다.

이 pre master secret key는 대칭키 이기 때문에 노출되서는 안된다.

이 생성한 pre master secret key는 아까 받은 서버의 public key로 암호화 해서 서버로 전송하면 서버에서는 private key로 복호화 할 수 있다. 여기서 사용할 public key는 서버로 부터 받은 인증서에 들어있다.

  1. 서버는 클라이언트가 전송한 pre master secret key 값을 private key로 복호화 한다. 이로써 클라이언트, 서버가 pre master secret key를 공유 할 수 있게 되었고 master secret 으로 변경한뒤 session key를 생성한다. 이 session key를 이용해 서버와 클라이언트는 대칭키방식으로 암호화 한 후에 데이터를 주고 받는다.

  2. handshake 종료

session

세션은 클라이언트와 서버가 데이터를 주고 받는데 위에서 생성한 session key를 이용해 대칭키 방식으로 암호화 하여 데이터를 전송한다.

서로 키를 가지고 있기 때문에 복호화도 서로 할 수 있다.

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


참고