mojo's Blog

대칭키 & 공개키 / HTTP & HTTPS 본문

Computer Science/네트워크

대칭키 & 공개키 / HTTP & HTTPS

_mojo_ 2022. 3. 12. 19:39

대칭키 & 공개키

 

대칭키(Symmetric Key)

암호화와 복호화에 같은 암호키(대칭키)를 사용하는 알고리즘이다.

동일한 키를 주고 받기 때문에 매우 빠르다는 장점이 있지만, 대칭키를 전달하는 과정에서 해킹 위험에 노출된다.

 

 

공개키 (Public Key)

암호화와 복호화에 사용하는 암호키를 분리하는 알고리즘이다.

자신이 가지고 있는 고유한 암호키(비밀키)로만 복호화할 수 있는 암호키(공개키)를 대중에 공개한다.

 

 

공개키 암호화 방식 진행 과정은 다음과 같다.

 

  1. A가 웹 상에 공개된 "B의 공개키" 를 이용해 평문을 암호화하여 B에게 보낸다.
  2. B는 자신의 비밀키로 복호화한 평문을 확인하고 A의 공개키로 응답을 암호화하여 A에게 보낸다.
  3. A는 자신의 비밀키로 암호화된 응답문을 복호화한다.

 

대칭키의 단점을 완벽하게 해결하였지만, 암호화 복호화가 매우 복잡하다. (암호화하는 키와 복호화하는 키가 서로 다르기 때문)

 

대칭키와 공개키 암호화 방식을 적절히 혼합하면 SSL 이 된다.

SSL 이란 Secure Sockets Layer 의 약자로 암호화 기반 인터넷 보안 프로토콜으로 현재 사용 중인 TLS 암호화의 전신이다.

SSL/TLS 를 사용하는 웹 사이트의 URL 에는 "HTTP" 대신 "HTTPS" 가 있다.

 

 

  1. A가 B의 공개키로 암호화 통신에 사용할 대칭키를 암호화하고 B에게 보낸다.
  2. B는 암호문을 받고, 자신의 비밀키로 복호화한다.
  3. B는 A로부터 얻은 대칭키로 A에게 보낼 평문을 암호화하여 A에게 보낸다.
  4. A는 자신의 대칭키로 암호문을 복호화한다.
  5. 앞으로 이 대칭키로 암호화를 통신한다.

 

즉, 대칭키를 주고받을 때만 공개키 암호화 방식을 사용하고 이후에는 계속 대칭키 암호화 방식으로 통신한다.

 

 

TLS/SSL HandShake

HTTPS 에서 클라이언트와 서버간 통신 전에 SSL 인증서로 신뢰성 여부를 판단하기 위해 연결하는 방식을 말한다.

 

 

♠ 진행 순서

 

  1. 클라이언트는 서버에게 "client hello" 메시지를 담아 서버로 보낸다. 이때 암호화된 정보를 함께 담는데, 버전, 암호 알고리즘, 압축 방식 등을 담는다.
  2. 서버는 클라이언트가 보낸 암호 알고리즘과 압축 방식을 받고, 세션 ID 와 CA 공개 인증서를 "server hello" 메시지와 함께 담아 응답한다. 이 CA 인증서에는 앞으로 통신 이후 사용할 대칭키가 생성되기 전, 클라이언트에서 handshake 과정 속 암호화에 사용할 공개키를 담고 있다.
  3. 클라이언트 측은 서버에서 보낸 CA 인증서에 대해 유효한 지 CA 목록에서 확인하는 과정을 진행한다.
  4. CA 인증서에 대한 신뢰성이 확보되면, 클라이언트는 난수 바이트를 생성하여 서버의 공개키로 암호화한다. 이 난수 바이트는 대칭키를 정하는데 사용되고, 앞으로 서로 메시지를 통신할 때 암호화하는데 사용된다.
  5. 2번 단계에서 서버가 클라이언트 인증서를 함께 요구할 경우, 클라이언트의 인증서와 클라이언트의 개인키로 암호화된 임의의 바이트 문자열을 함께 보내준다.
  6. 서버는 클라이언트의 인증서를 확인 후, 난수 바이트를 자신의 개인키로 복호화 후 대칭 마스터 키 생성에 활용한다.
  7. 클라이언트는 handshake 과정이 완료되었다는 finished 메시지를 서버에 보내면서, 지금까지 보낸 교환 내역들을 해싱 후 그 값을 대칭키로 암호화하여 같이 보내준다.
  8. 서버도 동일하게 교환 내용들을 해싱한 뒤 클라이언트에서 보내준 값과 일치한 지 확인한다. 일치하면 서버도 마찬가지로 finished 메시지를 이번에 만든 대칭키로 암호화하여 보낸다.
  9. 클라이언트는 해당 메시지를 대칭키로 복호화하여 서로 통신이 가능한 신뢰받은 사용자란 걸 인지하고, 앞으로 클라이언트와 서버는 해당 대칭키로 데이터를 주고받을 수 있게 된다.

 

HTTP / HTTPS

 

HTTP(HyperText Transfer Protocol)

인터넷 상에서 클라이언트와 서버가 자원을 주고 받을 때 쓰는 통신 규약이다.

HTTP는 텍스트 교환이므로, 누군가 네트워크에서 신호를 가로채면 내용이 노출되는 보안 이슈가 존재한다.

이러한 보안 문제를 해결해주는 프로토콜이 HTTPS 이다.

 

 

HTTPS(HyperText Transfer Protocol Secure)

인터넷 상에서 정보를 암호화하는 SSL 프로토콜을 사용하여 클라이언트와 서버가 자원을 주고 받을때 쓰는 통신 규약이다.

HTTPS 는 텍스트를 암호화한다. (공개키 암호화 방식으로 암호화)

 

 

♠ HTTPS 통신 흐름

 

  1. 애플리케이션 서버(A)를 만드는 기업은 HTTPS를 적용하기 위해 공개키와 개인키를 만든다.
  2. 신뢰할 수 있는 CA 기업을 선택하고, 그 기업에서 내 공개키 관리를 부탁하며 계약을 한다. (CA : Certificate Authority, 공개키를 저장해주는 신뢰성있는 검증된 민간기업)
  3. 계약 완료된 CA 기업은 해당 기업의 이름, A 서버 공개키, 공개키 암호화 방법을 담은 인증서를 만들고, 해당 인증서를 CA 기업의 개인키로 암호화해서 A서버에게 제공한다.
  4. A 서버는 암호화된 인증서를 갖게 되었다. 이제 A 서버는 서버의 공개키로 암호화된 HTTPS 요청이 아닌 요청이 오면,이 암호화된 클라이언트에게 건내준다.
  5. 클라이언트가 main.html 파일을 달라고 A 서버에 요청했다고 가정한다면 HTTPS 요청이 아니기 때문에 CA 기업이 A 서버의 정보를 CA 기업의 개인키로 암호화한 인증서를 받게 된다. (CA 기업의 공개키는 브라우저가 이미 알고 있음 -> 세계적으로 신뢰할 수 있는 기업)
  6. 브라우저는 해독한 뒤 A 서버의 공개키를 얻게 되었다. 이제 A 서버와 통신할 대는 얻은 A 서버의 공개키로 암호화해서 요청을 날리게 된다.

 

HTTPS 도 무조건 안전한 것은 아니다. (신뢰받는 CA 기업이 아닌 자체 인증서를 발급한 경우)

이 경우는 HTTPS 이지만 브라우저에서 "주의 요함", "안전하지 않은 사이트" 와 같은 알림으로 주의 받게 된다.

 

 

참고 : https://github.com/gyoogle/tech-interview-for-developer

 

GitHub - gyoogle/tech-interview-for-developer: 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖

👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.

github.com

 

'Computer Science > 네트워크' 카테고리의 다른 글

네트워크 정리  (0) 2022.08.17
UDP  (0) 2022.03.12
TCP/IP 흐름제어 및 혼잡제어  (0) 2022.03.06
OSI 7 계층  (0) 2022.03.02
Comments