SSL(Secure Sockets Layer)이란?

Hanu·2023년 9월 2일

HTTPS

HTTP는 HyperText인 html을 전송하기 위한 통신규약을 의미하고, 뒤에 S(Secure)를 붙인 HTTPS는 보안이 강화된 통신규약을 의미한다.

HTTP는 암호화 되지 않은 방식으로 서버에 데이터를 전송하기 때문에 중요한 데이터를 전송할 경우 HTTPS 프로토콜을 사용하여 통신해야 한다.

이러한 HTTPS는 SSL 프로토콜을 기반으로 돌아간다.

SSL

SSL은 Secure Sockets Layer의 약자로, 암호규약이다. SSL3.0을 계승하는 TLS1.0은 SSL의 new version으로서, 클라이언트/서버 응용 프로그램이 네트워크로 통신하는 과정에서 도청, 간섭, 위조 등을 방지하기 위해 설계되었으며, 암호화를 통해 최종단의 인증과 통신 기밀성을 유지시켜주는데, 보통 TLS도 SSL이라 칭하는 경우가 많다.

SSL 인증서

SSL 인증서란 클라이언트와 서버 간의 통신을 제 3자가 보증해주는 문서이다. 클라이언트가 서버에 접속하면 서버는 클라이언트에게 인증서를 전달하고, 클라이언트는 이 인증서를 보고 신뢰할 수 있는 대상인지 확인한 후 데이터를 보내는 등의 다음 절차를 수행한다.

SSL의 장점

즉, SSL의 장점은 다음과 같다.

  • 전달되는 내용이 타인에게 노출되는 것을 막을 수 있다.
  • 클라이언트가 접속하려는 서버가 신뢰할 수 있는 서버인지 알 수 있다.
  • 전달되는 내용이 악의적으로 변경되는 것을 막을 수 있다.

SSL 암호화 종류

대칭키

대칭키 방식은 동일한 키로 암호화와 복호화를 할 수 있는 기법을 말한다. 예를 들어 123를 사용하여 암호화하였다면 복호화도 123를 입력해야 가능하다.

암호화(=암호를 만드는 행위)를 할 때 사용하는 비밀번호를 키(key)라고 한다. 이 키에 따라서 암호화된 결과가 달라지기 때문에 키를 모른다면 암호를 푸는 행위인 복호화도 할 수 없다.

대칭키의 단점

클라와 서버는 대화를 하기 위해서 반드시 대칭 키를 알고 있어야 한다. 그렇기 때문에 통신을 하기 앞서 키를 전달해야하는 과정이 필요하다.

그런데 만약 중간에 대칭키가 유출된다면 키를 획득한 공격자는 암호화된 데이터를 복호화하여 볼 수 있기 때문에 HTTPS를 사용할 필요성이 사라진다.

이러한 단점을 보완하기 위해 나온 방식이 공개키 기법이다.

공개키

공개키 방식은 대칭키 방식과 다르게 2개의 키를 가지고 시작한다. 이를 각각 공개키(public key), 비밀키(private key, 개인키/비밀키)라 부른다. 비밀키는 자신만이 소지하고 공개키는 타인에게 제공한다.

동작 원리는 다음과 같다.

  1. 공개키로 암호화하면 비밀키로 복호화 한다.

  2. 비밀키로 암호화하면 공개키로 복호화 한다. 예를 들어, 클라이언트가 서버의 공개키를 가지고 1234(정보)를 암호화하여 서버에 !@#$ 라는 text를 전달한다. 서버는 클라이언트가 보낸 !@#$ 라는 단어를 비밀키로 복호화하여서 1234라는 것을 확인한다.

일반적으로는 공개키로 암호화 -> 비밀키로 복호화를 한다고 칭한다. 그렇다고 비밀키로 암호화 -> 공개키로 복호화가 틀리다는건 아니다.

그렇기 때문에 개념을 다음처럼 생각하는게 좋다.

공개키 = A / 비밀키 = B

"A 키로 암호화한 데이터를 B 키로 복호화 한다."

즉 키를 공개키로 부르냐 비밀키로 부르냐의 차이가 있을 뿐, 사실상 데이터의 보안을 위해 사용되는 키라는 점을 기억하자.

공개키는 공개되어 있으며 보통 디지털 인증서안에 포함되어 있다. 그렇기 때문에 공개키가 존재한다는건 서버의 신원이 안전하다고 볼 수 있다.

이것을 우리는 전자서명이라고 부른다.

공개키의 단점

공개키 암호화 방식의 알고리즘은 계산이 느리다는 단점이 있다.

SSL 통신 과정

SSL 통신은 handshake -> session -> end session의 과정을 거친다.

Step 1

  • Client Hello
    클라이언트는 랜덤한 데이터와 현재 지원가능한 암호화 방식을 서버에 전달한다. 즉, 자신의 능력을 서버에게 말해준다.

Step 2

  • Server Hello
    서버가 1) 공개키를 포함한 인증서, 2) 서버에서 생성한 랜덤한 데이터, 3) 클라이언트가 지원가능한 암호화 방식 중 가장 안전한 방식을 응답한다.

Step 3

  • 클라이언트는 내장되어 있는 CA 리스트에서 각 CA의 공개키를 이용하여 서버가 보낸 인증서를 복호화 한다.
  • CA 리스트에 없는 인증서라면 사용자에게 경고 메시지를 띄운다.
  • 복호화 성공 시 해당 인증서는 CA의 개인키로 암호화 한 문서임이 보증되었기 때문에, 서버를 신뢰할 수 있게 된다. 클라이언트가 전송한 랜덤 데이터와 서버가 보낸 랜덤 데이터를 조합하여 Pre Master Secret 키를 생성한다.

Step 4

  • Step 2에서 받은 공개키를 이용하여 Pre Master Secret 키를 암호화하여 서버로 전송한다.
  • 서버는 Pre Master Secret 값을 자신의 비밀키로 복호화 하고, 이로써 클라이언트와 서버는 Pre Master Secret 키를 공유하게 된다.

Step 5

  • 서버와 클라이언트는 일련의 과정을 거쳐 Pre Master Secret 값을 Master Secret 값으로 만든다. 그리고 이를 이용해 Session Key를 만든다.

Step 6

  • 클라이언트와 서버 간의 세션이 형성되고 Session Key를 이용하여 암호화 된 데이터를 주고 받는다. 즉, 대칭키 방식으로 데이터를 주고 받는다.
  • 즉, 대칭키는 공개키에 비해 빠르지만 보안 문제가 존재하는데, SSL 핸드쉐이킹 과정에서는 공개키 방식을 사용하고 세션 형성 이후에는 대칭키 방식을 사용함으로써 효율을 높였다.

참고자료

profile
우연이 아니라 필연적인 프로그래밍

0개의 댓글