2020. 5. 5. 13:32ㆍFrontend
이 포스팅은 HowHttpsWorks를 정리한 글임을 서두에 밝힙니다.
HTTP는 HyperText Transfer Protocol의 약어로, 인터넷에서 HTML, JSON, XML 등 텍스트 기반의 데이터를 주고받을 수 있는 프로토콜을 의미합니다. HTTP가 등장하면서 웹도 덩달아서 빠르게 발전하게 되었는데 이에 따라 도청, 중간자 공격 등 여러 보안 문제들이 발생하게 되었습니다. 이를 해결하기 위해 등장한 프로토콜이 이번 포스팅에서 설명할 HTTPS(HTTPS + Secure)입니다.
어떤 사이트에 접속했을 때, 브라우저의 URL표시 줄에 위의 그림처럼 녹색 자물쇠가 나타나는 경우가 있습니다. (브라우저마다 다르지만, 대체로 잠겨있는 자물쇠가 같이 표시됩니다.) 이는 브라우저와 해당 사이트를 호스팅 하는 서버가 HTTPS 프로토콜(HTTP 연결에 보안을 더한 통신 프로토콜)을 사용하기로 약속했으며, 이를 보장하는 인증서를 통해 앞으로 주고받는 데이터의 안전한 통신을 보장한다는 의미입니다.
HTTPS가 필요한 이유
HTTPS가 필요한 이유는 HTTPS라는 이름 자체(Secure HTTP) 에서 확인할 수 있듯이 '보안' 문제입니다. HTTP프로토콜을 이용하여 전송하는 정보들 중에는 아이디, 패스워드 등의 중요한 정보가 있을 수 있기 때문에 나와 상대방이 통신하는 메세지는 중간에 누군가가 읽어서도 안되며, 메시지를 변조해서도 안되며, 상대방에게 도착한 메시지가 나로부터 온 것이 확실함을 보장해야 합니다.
이를 요약하면 개인정보 보호, 무결성, 식별 이라고 할 수 있습니다.
1. 개인 정보 보호
개인정보 보호란 아무도 중간에 메세지를 가로챌 수 없음을 의미합니다. 실제로 상대방에게 오프라인으로 편지를 보낼 때에는 그냥 가방 안에 꼭꼭 넣어두었다가 상대방을 만나서 전달해주면 되지만, 온라인에서는 모든 메시지가 특정 크기로 조각난 패킷(Packet)의 형태로 전송되기 때문에 누구나 스니핑 공격 등을 통해 쉽게 가로챌 수 있고, 복사할 수 있습니다.
따라서 온라인상에서 메시지를 가로챌 수 없다는 것은 "누구도 이 패킷을 도청할 수 없다" 보다는 지정된 상대방 외에는 누구도 이 메시지를 해독할 수 없다! 의 개념에 가깝습니다. 즉, 허용된 사용자 외에는 누구도 메세지를 가로채서 해석할 수 없음을 의미합니다. HTTPS는 이를 보장하지만, HTTP는 이를 보장하지 않기 때문에 HTTP를 통해 비밀번호, 계좌번호 등의 중요한 정보를 전달하는 경우에는 항상 도청의 위험이 있습니다.
2. 무결성
무결성이란 송신자가 전송한 메세지가 수신자에게 도달하는 동안 변조되지 않았음을 의미합니다. 무결성이 지켜지지 않는 프로토콜은 중간자 공격에 취약하다는 특성을 지니고 있습니다. 중간자 공격이란 아래 그림과 같이 A에서 B로 메시지가 가는 도중에 이를 탈취해서 악의적인 내용들을 담아서 전송하는 것을 의미합니다. 단순히 악의적인 메시지를 담는 것을 넘어서 악의적인 금융 사기나, 바이러스들을 심어서 전송할 수 있기 때문에 통신 프로토콜에서 무결성은 굉장히 중요한 비중을 차지하고 있습니다. HTTPS는 인증서를 통해 이 무결성을 보장하는 프로토콜입니다.
3. 식별
식별(Identification) 이란 내가 받은 메세지가 올바른 송신자로부터 온 것인지를 확인하는 것을 의미합니다. 본인임을 자청하는 악의적인 사용자로부터의 피해를 막기 위해서 송신자는 메시지에 암호와 알고리즘이 적용된 디지털 서명을 첨부하여 메시지를 보낸 대상이 수신자가 생각하는 그 대상이 맞음을 보장합니다. 웹에서 '식별'의 의미는 방문하는 사이트가 실제로 내가 생각하는 그 사이트(그 사이트 파일을 보낸 서버가 내가 생각하는 그 사이트를 호스팅 하는 서버가 받는지)인지를 보장하는 것입니다. HTTPS프로토콜은 SSL 인증서를 통해서 이를 보장합니다.
암호화
HTTPS가 개인정보보호, 무결성, 식별 등의 기능을 제공하기 위해서는 올바른 암호화 알고리즘을 사용해야 합니다. 비대칭 암호화와 대칭 암호화를 모두 사용하는데, 대칭 암호화가 사용되는 부분은 아래 핸드 셰이크(Handshake) 부분에서 다루도록 하겠습니다.
비대칭 알고리즘이란 공개키와 개인키 두 쌍으로 암호화와 해독을 수행하는 방법입니다. 공개키로는 메세지를 암호화하고 개인키로만 그 메시지를 해독할 수 있는 방식으로 공개키는 말 그대로 여러 사람들에게 공개하는 키이고 개인키는 사용자 본인만이 가지고 있어야 하는 키입니다. 암호화 방식은 다음과 같습니다.
1. A라는 사용자가 공개키와 개인키를 만들고, 공개키를 여러 사람들에게 나누어 준다.
2. A의 공개키를 획득한 사용자가 메세지를 작성한 다음 A의 공개키로 암호화하여 A에게 전송한다.
3. A는 전송된 메세지를 자신의 개인키를 사용하여 해독한다.
개인 키만이 공개키로 암호화된 메시지를 해독할 수 있다는 것이 비대칭 암호화 알고리즘의 특징입니다.
핸드 셰이크 (handshake)
웹 브라우저(클라이언트)와 웹 사이트를 호스팅 하는 서버가 HTTPS를 사용한 연결을 만들기 위해서는 양쪽 모두 HTTPS 사용에 동의해야 하며, 합의된 암호와 알고리즘 등의 통신 방식을 정해야 합니다. 서버와 브라우저가 HTTPS연결을 사용하기 위해 진행해야 하는 협상 프로세스를 핸드셰이크라고 합니다. 진행 방식은 다음과 같습니다.
1. 클라이언트(웹 브라우저)에서 SSL/TLS(인증서) 버전 및 암호와 알고리즘 목록을 서버에 보냅니다.
2. 서버에서는 클라이언트에서 보낸 목록 중에 선호도에 따라 적합한 알고리즘을 선택합니다. 그리고 선택한 내용들을 자신의 공개키가 포함된 인증서로 클라이언트에게 회신합니다. (공개키를 전송했다는 것은 비대칭 암호화 알고리즘을 사용하겠다는 의미입니다.).
3. 클라이언트에서는 서버의 인증서가 합법적인지 확인하고, pre-master key를 생성합니다. pre-master key는 HTTPS연결 이후에 클라이언트와 서버에서 암호화를 위해 사용하는 대칭키 암호화 방식을 위한 키로, 이를 통해 클라이언트와 서버에서 하나의 키로 암호화와 복호화를 진행할 수 있습니다.
4. 이 pre-master key는 타인에게 공개되면 안되기 때문에 이를 서버가 보낸 공개키로 암호화하여 서버에 보냅니다. 개인키를 가진 서버와, 이 pre-master key를 가진 클라이언트만이 이 키의 존재를 알 수 있습니다.
5. 서버에서는 개인키로 pre-master key를 해독하고, 남은 세션 동안 둘 사이의 데이터 연결은 HTTPS 프로토콜에 의해 보호받게 됩니다.
Final Process
HTTPS는 HTTP를 통해 전송되는 여러 정보들이 노출되는 것을 방지하기 위해 암호화 알고리즘을 사용하여 허가받은 주체들만 이 정보들에 접근할 수 있도록 하는 기술입니다. 실제로 HTTPS를 적용한 웹사이트의 경우 브라우저에서 이를 적용하려 할 때 다음과 같은 과정을 거칩니다.
- 사용자가 브라우저 주소창에 HTTPS프로토콜이 사용된 주소를 입력합니다. e.g) https://yeoulcoding.tistory.com
- HTTPS로 통신하기 위해서는 인증서가 필요합니다. 브라우저에는 기본적으로 comodo등 신뢰받는 공인된 인증기관들의 정보가 포함되어 있습니다. 따라서 이 인증기관에 접속하려 하는 도메인(웹서버)의 인증서가 있는지를 확인하고 인증서를 받습니다.
- 인증기관에서는 인증서를 전송해주게 되고, 이 인증서에는 암호화키가 있습니다. 이 암호화 키를 가지고 데이터를 암호화하여 데이터를 주고받게 됩니다. (암호화 복호화는 위의 설명을 참고)
이렇게 HTTPS는 HTTP통신의 단계를 거치기 전에 해당 웹서버(도메인으로 접속하려하는)의 인증서를 발급받아 암호화 키를 받고, 이 암호화 키를 가지고 데이터 암호화/복호화 단계를 거쳐서 통신하는 방식입니다.
'Frontend' 카테고리의 다른 글
[OAuth] OAuth 2.0 (0) | 2020.07.04 |
---|---|
JIT vs AOT 컴파일러 (1) | 2020.06.16 |
[Crawler] Selenium으로 Everytime 크롤링하기 (1) | 2020.05.10 |
Await vs Return vs Return Await (1) | 2020.04.06 |
CORS 란 (0) | 2020.04.04 |