대칭키 vs 비대칭키


Http vs Https


둘의 차이점

이 둘의 가장 큰 차이점은 보안으로 볼 수 있다. Https의 경우에는 SSL(Secure Socket Layer)을 이용해서

클라이언트의 민감한 정보들을 암호화 및 복호화 해준다.


그렇다면 Https는 어떤 방식을 사용해서 정보들을 안전하게 지켜주는 것일까?

오늘은 Https의 암호화 및 복호화 방법에 대해서 면접준비 겸 궁금증 해결 겸 공부를 해보겠다.


대칭키와 비대칭키


Https의 암호화 및 복호화 방식은 대칭키 암호화, 비대칭키 암호화로 나뉜다.

아래에서는 각각의 특징과 장,단점 그리고 동작과정에 대해 정리하고 공부했다.


대칭키(Symmetric Key)

[ 대칭키 암호화 ]

대칭키 암호화 방식이란, 각 엔드포인트에서(클라이언트, 서버) 정보를 암호화 및 복호화 할 때

사용하는 키가 동일한 경우이다.


[ 장점 ]

• 공개키(비대칭키) 암호화 방식에 비해 빠르다.


[ 단점 ]

• 최초 한 번은 무조건 대칭키를 공유해야 하는데, 이 과정에서 대칭키 탈취 위험이 있다.


[ 동작과정 ]

⒈ 클라이언트가 대칭키로 개인정보를 암호화해서 서버에 전송한다.

⒉ 서버는 대칭키로 암호화된 개인정보를 서버가 가지고 있는 대칭키로 복호화한다.


공개키(Public Key)/비대칭키(Asymmetric Key)

[ 비대칭키 암호화]

비대칭키 암호화 방식이란, 각 엔드포인트에서(클라이언트, 서버) 정보를 암호화 및 복호화 할 때

사용하는 키가 동일하지 않은 경우이다.

이 방식에서는 개인키, 공개키 이렇게 두 가지 키가 사용이 된다.

  • 공개키 : 모든 클라이언트가 접근 가능한 키
  • 개인키 : 서버쪽에서 보관하는 키


[ 장점 ]

• 클라이언트와 서버가 서로 키를 공유하지 않아도 된다.

• 기밀성, 인증, 기능을 제공한다.


[ 단점 ]

• 대칭키 암호화 방식에 비해 속도가 느리다.


[ 동작과정 ]

서버에서 개인키로 암호화 된 데이터를 클라이언트에게 전송한다.

클라이언트는 공개키를 통해 서버로 부터 받은 데이터를 복호화 한다.

반대로, 클라이언트가 서버에 데이터를 전송할 때는 공개키로 데이터를 암호화하고

서버 쪽에서는 이 암호화된 데이터를 서버가 가지고 있는 개인키로 복호화 한다.


HTTPS 통신


들어가기 앞서

위에서 대칭키와 비대칭키 암호화 방식에 대해서 알아보았다.

그런데 여기서 한 가지 궁금한 점은 비대칭키 암호화 방식을 사용할 때, 클라이언트가

서버로 부터 전달 받은 (암호화 된) 데이터의 출처를 어떻게 알 수 있는지이다.

Naver가 데이터를 보낸 줄 알았는데 Never일 수도 있으니까…!


SSL Handshake

SSL HandShake의 궁극적인 목표는 아래와 같다.

  • 서버와 클라이언트가 주고 받을 데이터의 암호화 알고리즘을 결정
  • 서버와 클라이언트가 주고받을 데이터의 암호화를 위한 대칭키 생성.



위 이미지에서 노란색 플로우가 SSL HandShake 과정이다.


[ 클라이언트에서 서버의 SSL 인증서 검증 ]

SSL인증서를 발급한 CA는 CA의 비밀키를 이용해 인증서를 암호화 한다. 그래서 SSL 인증서는 CA의 공개키

이용해서만 복호화 할 수 있다. 클라이언트는 해당 CA의 공개키를 브라우저에 가지고 있기 때문에, 해당 공개키

통해서 암호화된 인증서를 복호화한다. 성공적으로 복호화된 인증서에는 서버의 공개키가 포함되어 있다.


이 과정을 통해 클라이언트가 전달 받은 데이터가 Naver에서 온 것인지, Never에서 온 것인지 확인할 수 있는 것이다.

만약 인증서가 성공적으로 인증이 되지 않는다면, 브라우저 주소창에 Not secure라는 문구가 나타난다.


[ 대칭키와 비대칭키의 콜라보레이션 ]

이렇게 SSL 인증까지 성공적으로 마쳤으면, 이제 클라이언트와 서버가 데이터를 주고 받는 일만 남았다.

여기서 하나 재밌는 사실이 있는데 HTTPS 통신에서는 대칭키 방식과 비대칭키 방식을 혼합해서 사용한다는 점이다.

혼합해서 사용하는 이유는 비대칭키 방식으로만 통신을 하게 되면 컴퓨터에 너무 무리가 가기 때문이다.


어떻게 두 개의 방식을 혼합해서 사용하는지 알아봤다.

클라이언트에서 서버로 데이터를 전송할 때는 대칭키로 암호화한다. 그러나 대칭키로만

암호화 및 복호화를 하면 탈취당할 위험이 있어 이를 방지하기 위해 비대칭키를 사용하는 것이다.


[ 대칭키를 생성하는 매커니즘 ]

우선 클라이언트와 서버가 Hand-Shake 하는 과정에서 생성된 임의의 데이터를 혼합하여 임시키를 만든다.

그리고 클라이언트 측에서 이 임시키서버의 공개키로 암호화해서 서버로 보낸다.

그리고 서버 측에서는 전달 받은 암호화된 키를 서버의 개인키로 복호화 한다.

이렇게 일련의 과정이 마무리되면 클라이언트와 서버는 둘만 알고 있는 대칭키를 갖게 되는 것이다.


공부에 참고한 링크


얄팍한 코딩사전 - HTTPS가 뭐고 왜 쓰나요?(Feat. 대칭키 vs. 비대칭키)

GitHub - Tech Interview For Developer

티스토리 블로그 - HTTPS 통신 과정