-
728x90
본 포스팅은 jisikTank 스터디에 참여하며 정리한 문서입니다.
jisikTank CS지식 Git Repository
HTTPS와 공개키
HTTP(HyperText Transfer Protocol)
- 인터넷 상에서 클라이언트와 서버가 자원을 주고 받을 때 쓰는 통신 규약
HTTPS(HyperText Transfer Protocol Secure)
- 인터넷 상에서 정보를 암호화하는
SSL
프로토콜을 사용해 클라이언트와 서버가 자원을 주고 받을 때 쓰는 통신 규약 - HTTPS는 텍스트를 공개키 암호화 방식으로 암호화한다.
- 인터넷 상에서 정보를 암호화하는
웹사이트에서 로그인을 할 때 HTTP로 정보를 보내면 이 정보를 1) 제 3자가 쉽게 보거나, 2) 해당 웹사이트로 위장한 피싱 문제에 쉽게 노출될 수 있다.
이와 같은 문제를 HTTPS가 해결할 수 있어 HTTP보다 더 안전하다.
즉, HTTPS의 핵심 기능은 아래와 같다
- 내가 사이트에 보내는 정보들을 제 3자가 못 보게 한다.
- 접속한 사이트가 믿을 만한 곳인지를 알려준다.
대칭키 vs 비대칭키
대칭키(Symmetric Key)
- 메시지를 보내는 쪽(암호화)과 메시지를 받는 쪽(복호화)이 같은 암호 방식을 공유하는 방식
- 동일한 키로 주고 받기 때문에, 매우 빠르다는 장점이 있음
- 대칭키 전달 과정에서 해킹 위험 노출
키 값이 노출되지만 않는다면 안전하지만, 결국 한 번은 한 쪽에서 다른 한 쪽으로 키를 전송해야 하는데 그 과정에서 키가 노출될 수 있다.
이와 같은 문제를 해결하기 위해 공개키라 불리는 비대칭키 방식이 등장한다.
비대칭키(= 공개키, Public Key)
- 각 네트워크 참여 주체가 한 쌍을 이루는 두 키를 두어 하나는 개인키, 하나는 공개키로 사용하는 방식
- 암호화와 복호화에 사용하는 암호키를 분리한 알고리즘
- 자신이 가지고 있는 고유한 비밀키로만 복호화할 수 있는 공개키를 대중에 공개함
공개키 암호화 방식 진행 과정
- A가 웹 상에 공개된 'B의 공개키'를 이용해 평문을 암호화하여 B에게 보냄
- B는 자신의 비밀키로 복호화한 평문을 확인, A의 공개키로 응답을 암호화하여 A에개 보냄
- A는 자신의 비밀키로 암호화된 응답문을 복호화함
대칭키의 단점을 완벽하게 해결했지만, 암호화 복호화가 매우 복잡함
(암호화하는 키가 복호화하는 키가 서로 다르기 때문)
사이트의 공개키로 암호화해 정보를 보내는 과정에서 제 3자가 정보를 탈취해도, 이는 해당 사이트의 개인키로만 복호화할 수 있어 해커가 정보를 해독할 수 없다.
네이버에서 일부 정보(인증서)를 CA의 개인키로 암호화해 정보를 제공하면, 이는 CA의 공개키로 복호화해 받은 인증서가 네이버인지 확신할 수 있다. 만약 정보를 보내온 서버가 네이버가 아니라면 CA의 공개키로 복호화되지 않기 때문에 가지고 있는 네이버의 공개키만 검증할 수 있다면 피싱으로부터 안전하다!
HTTPS 통신 흐름
- Client는 Server로 임의의 데이터를 담은 통신 요청을 송신한다.
- Server는 답변으로 역시 Server측에서 무작위로 생성한 데이터와 자신의 인증서를 송신한다.
- Client는 브라우저에 내장된
CA(Certificate Authority)
로 인증서의 진위 여부를 확인한다.
(CA의 인증을 받은 인증서는 CA의 개인키로 암호화되어 있어 CA의 공개키로 복호화할 수 있다.) - 성공적으로 인증받은 Server의 공개키를 확인하면, Client는 해당 Server를 신뢰하고 이후 대칭키와 비대칭키를 혼합해 사용한다.
(모든 데이터를 비대칭키로만 주고 받는 경우 과도한 부하가 발생하기 때문 ->SSL
) - 먼저 대칭키를 생성하여 비대칭키로 주고 받아 안전하게 대칭키를 Server와 브라우저만 공유하는 대칭키를 설정한다.
- 데이터를 대칭키를 사용해 암호화/복호화하며 데이터를 주고 받는다.
대칭키와 공개키 암호화 방식을 적절히 혼합한 방식? -> SSL의 기초
SSL 탄생의 시초가 됨
1. A가 B의 공개키로 암호화 통신에 사용할 대칭키를 암호화하고 B에게 보냄 2. B는 암호문을 받고, 자신의 비밀키로 복호화함 3. B는 A로부터 얻은 대칭키로 A에게 보낼 평문을 암호화하여 A에게 보냄 4. A는 자신의 대칭키로 암호문을 복호화함 5. 앞으로 이 대칭키로 암호화를 통신함
즉, 대칭키를 주고받을 때만 공개키 암호화 방식을 사용하고 이후에는 계속 대칭키 암호화 방식으로 통신하는 것!
Quiz
- HTTP와 HTTPS의 차이는 무엇인가요?
- HTTPS가 동작하는 방식에 대해서 설명해주세요.
- 공개키는 암호화 목적으로만 사용되고, 개인키는 복호화 목적으로만 사용되나요?
- 비대칭키를 활용한 통신이 대칭키 활용 통신보다 느린 이유는 무엇입니까?
참고 자료
- 신입 개발자 전공 지식 & 기술 면접 백과사전: 대칭키 & 공개키, HTTP & HTTPS
- HTTPS가 뭐고 왜 쓰나요? - 얄팍한 코딩사전(Youtube)
- 신입 웹개발자 기술면접(네트워크)
- 공개키 암호란
- 비대칭키
Quiz 답안
- HTTP와 HTTPS의 차이는 무엇인가요?
데이터를 주고 받는 과정에 보안 요소 추가 s의 차이가 secure, 공개키 암호화
HTTPS: SSL 프로토콜 이용하여 웹브라우저와 서버가 데이터를 주고받는 통신 규약
- HTTPS가 동작하는 방식에 대해서 설명해주세요.
- Client는 Server로 임의의 데이터를 담은 통신 요청을 송신한다.
- Server는 답변으로 역시 Server측에서 무작위로 생성한 데이터와 자신의 인증서를 송신한다.
- Client는 브라우저에 내장된
CA(Certificate Authority)
로 인증서의 진위 여부를 확인한다.
(CA의 인증을 받은 인증서는 CA의 개인키로 암호화되어 있어 CA의 공개키로 복호화할 수 있다.) - 성공적으로 인증받은 Server의 공개키를 확인하면, Client는 해당 Server를 신뢰하고 이후 대칭키와 비대칭키를 혼합해 사용한다.
(모든 데이터를 비대칭키로만 주고 받는 경우 과도한 부하가 발생하기 때문 ->SSL
) - 먼저 대칭키를 생성하여 비대칭키로 주고 받아 안전하게 대칭키를 Server와 브라우저만 공유하는 대칭키를 설정한다.
- 데이터를 대칭키를 사용해 암호화/복호화하며 데이터를 주고 받는다.
- 공개키는 암호화 목적으로만 사용되고, 개인키는 복호화 목적으로만 사용되나요?
그렇지 않습니다. 공개키로 암호화를 선택했다면 데이터 보안에 중점을 두고, 개인키로 암호화를 진행했다면 안전한 전자서명을 통한 인증 과정에 중점을 두고 사용합니다. 그러나 일반적으로 공개키로 암호화하는 관계를 말하며 개인키로 암호화하는 것을 개인키와 공개키의 관계를 역이용한다고 합니다. 특정 문서를 개인키로 암호화하여 발송하면 이 문서는 해당 발신자의 공개키로만 복호화가 가능한데, 활용의 예를 들면 HTTPS 통신 과정에서 클라이언트가 서버로 통신을 요청했을 때 서버는 응답으로 인증서를 전달합니다. 이 때, 서버의 공개키를 담은 인증서는 CA의 개인키로 암호화되어 있습니다. 클라이언트는 이를 CA에 확인하는 과정을 거쳐 서버를 신뢰합니다. 인증서는 CA가 서버와의 계약으로 발급한 일종의 전자서명이고 이는 개인키와 공개키의 관계를 역이용한 사례입니다.
- 비대칭키를 활용한 통신이 대칭키 활용 통신보다 느린 이유는 무엇입니까?
비대칭키의 대표적인 알고리즘으로는 RSA, 디피-헬만, 타원곡선암호 등이 있습니다. 가장 대표적인 RSA는 기본적인 정수론, 소수를 이용하는데 중요 정보를 두 개의 소수로 표현한 후, 두 소수의 곱을 힌트와 함께 암호로 사용합니다. c = a * b(a, b는 소수)라 할 때, a, b를 가지고 c를 구하는 것은 비교적 쉽게 구할 수 있지만 c를 먼저 제시하고 곱해진 두 소수 a, b를 구하는 문제는 풀기가 쉽지 않습니다. c를 공개해도 a 또는 b를 구하는 것이 대단히 어려우므로 c는 공개키로, a는 개인키로 사용합니다.
그러나 수학적인 난제를 기반으로 설계된 비대칭키는 암호화나 복호화를 수행하기 위한 연산이 복잡한 수학 연산을 기반으로 구성되어 있기 때문에 효율성이 대칭키 암호(AES, SEED)에 비해 약 1,000배에 달합니다. 비대칭키는 길이가 긴 키의 소인수 분해가 어렵다는 특성을 활용한 알고리즘인 만큼 대칭키에 비해 키 사이즈가 상대적으로 크고 연산이 복잡합니다. 대칭키의 대표적인 알고리즘인 AES는 128, 192, 256비트 크기의 키를 사용합니다. 반면 비대칭키의 공개키의 경우 512, 1024, 2048 비트의 키를 사용합니다. 따라서 비대칭키를 사용한 암호화, 복호화는 대칭키의 사용보다 부하가 크고, 사용에 제약이 따를 수 밖에 없습니다. 아래 표는 비대칭키 암호화 방식에서 활용하는 비밀키 암호화와 공개키 암호화의 정리 비교 표입니다.(비대칭키 vs 대칭키가 아닙니다.)
'CS > Network' 카테고리의 다른 글
로드밸런싱(Load Balancing)이란? (0) 2021.04.20 NAT(Network Address Translation)이란? (1) 2021.04.20 UDP(User Datagram Protocol)이란? TCP/IP 비교 (0) 2021.04.20 DNS(Domain Name System)이란? (0) 2021.04.20 TCP 흐름제어와 혼잡제어 (0) 2021.04.20 댓글