본문 바로가기

네트워크 공부

HTTPS란 대체 뭘까? 대칭키와 비대칭키

 HTTP를 User와 서버에서 주고 받을 때 네트워크 상에서 어떤 누군가가 신호를 인터셉트하면 소중한 개인 정보가 유출될 가능성이 있다. 이러한 취약점을 해결하기 위한 프로토콜이 HTTPS이다.

HTTP에 S (Secure Socket)가 추가된 형태이다.

기본 골격은 HTTP와 거의 동일하지만 데이터를 주고 받는 과정에 '보안'요소가 추가되었다.

 

웹페이지를 돌아다니다 보면 나오는 이 자물쇠 표시가 안전하게 HTTPS를 통해 보호되고 있다는 뜻이다.

 

어떻게 보안할까? 그것은 바로 대칭키와 비대칭키라는 요소를 사용한다.

SSL이나 TLS 프로토콜을 사용하여 세션 데이터를 암호화한다.

 

TLS : Transport Layer Security의 줄임말. SSL에서 발전하여 변경된 이름이지만 아직도 SSL이란 이름이 통상적으로 사용된다.

단어의 원어에서 알 수 있듯이, TCP, UDP와 같은 인터넷 통신 레이어에 안전한 계층 Layer를 추가하는 방식이다.

이 기술을 구현하기 위해서 설치하는 것이 SSL/TLS인증서이다.

HTTPS 대칭키 / 비대칭키

 

  • 대칭키

대칭키는 존재하는 하나의 키(key)를 암호화하거나 복호화할 때 사용하는 방식이다.

서버에서 복호화할 때, 클라이언트가 암호화할 때 모두 같은 키를 사용한다. 하나의 키에 자물쇠 하나인 셈이다.

하지만 이 열쇠를 누군가 훔쳐본다면 말짱 도루묵이다.

대칭키는 간편한 사용이라는 장점이 있지만, 그만큼 보안에 있어 쉽게 도난당할 수 있다는 치명적인 단점이 있다.

 

 

 

  • 공개키 (= 비대칭키)

공개키 암호화 방식은 총 두개의 키를 사용한다. 공개키와 개인키를 한 쌍으로 사용한다.

공개키로 암호화를 하고, 개인키로 복호화를 하는데 같은 쌍이 아닌 다른 쌍을 사용하려 하면 암호화/ 복호화가 불가능하다

공개키는 말 그대로 누구에게나 공개할 수 있다. 공개키를 악의적인 목적으로 가져갔다 하더라도 한 쌍이 없이는

복호화가 불가능하기 때문에 상관이 없다. 공개키 방식은 대칭키 방식에 비해서는 안전하지만 과정이 길고 복잡하고

컴퓨터를 느리게 만들기 때문에 실제에서는 공개키와 대칭키를 번갈아가며 사용한다.

 

 

CA (Certificate Authority)

공개키가 정품인지를 확인해주는 공인된 민간기업

엄격한 인증과정을 거쳐야만 CA가 될 수 있다.

우리가 자주 쓰는 크롬이나 파이어폭스, 엣지 등의 웹브라우저에는 CA목록이 내장되어 있다.

 

Handshake

클라이언트가 처음에 서버를 신뢰하지 못할 때 거치는 일종의 탐색과정

 

먼저, 클라이언트는 랜덤 데이터를 생성하게 되고 서버에 보낸다.

서버는 답변으로 서버측에서 생성한 무작위 데이터와 인증서를 실어 보낸다.

 

그럼 웹브라우저는 내장된 CA정보를 사용해서 이 인증서를 확인하게 된다.

이때 사용하는 방식은 비대칭키 방식

 

이 인증서는 CA의 개인키로 암호화가 되어 있기 때문에

공개키로 복호화가 된다.

공개키로 복호화될 수 있는 인증서는 CA밖에 발급하지 못하기 때문에

복호화되었다면 그자체로 믿을만한 인증서인 것이다.

 

복호화가 안되었다면 브라우저에

이런식으로 알림표시가 뜨게 되는 것이다.

 

그렇게 성공적으로 인증서를 복호호하면 서버의 공개키를 알 수 있게 된다.

그럼 이제 이 공개키를 사용해 암호화 / 복호화를 하면 되겠구나!

NO!!

그건 아니다.

위에서 서술했듯이 비대칭키 방식은 컴퓨터에 많은 부담을 주기 때문에 실제에서는

공개키와 비대칭키를 혼합해서 사용한다.

 

클라이언트느 아까 handshake할 때 주고받았던 랜덤 데이터들을 혼합해서 어떤 임시 키를 만들고

이 임시 키 자체가 서버의 공개키로 암호화되면서 서버로 보내진 다음 양쪽에서 일련의 과정을 거쳐서

동일한 대칭키가 만들어진다.

 

 

비대칭키를 이용한

handshake할 때 생성된 랜덤 데이터들을 혼합해서 키를 만들었기 때문에 이는 서버와 클라이언트만 갖고 있는

키이다. 그래서 안전함이 보장되면서 컴퓨터에도 무리를 덜 주는 대칭키를 서로 주고받는 것에 성공했다.

 

 

 

 

사실 HTTPS를 해놓는 다고 해서 모든 보안 문제가 해결되는 것은 아니지만

안할 수 없는 최소한의 필수 요건이라고 볼 수 있겠다.

 

 

** 참고 소스

https://youtu.be/H6lpFRpyl14

https://rachel-kwak.github.io/2021/03/08/HTTPS.html

https://jaeseongdev.github.io/development/2021/07/02/HTTPS,SSL,TLS/