개요
지난 번에는 HTTP 프로토콜의 변천사에 대해 알아보면서, ‘어떻게 하면 더 빨리’ 메시지를 보내도록 바뀌었는지 그 과정을 알아보았다. 이번에는 ‘더 안전하게’ 메시지를 보내기 위해 나온 HTTPS에 대해, 더 정확히는 그 메시지를 보내는 과정에 무엇이 추가 되었고 어떻게 메시지를 보내는지에 대해 알아보고자 한다.
HTTP
HTTP(Hyper Text Transfer Protocol)는 서버와 클라이언트가 데이터를 주고 받을 때 사용하는 프로토콜이다. HTTP는 텍스트, 이미지, 영상, JSON 등등 거의 모든 형태의 데이터를 전송할수 있다.
HTTP는 상태 정보를 저장하지 않는 무상태성(Stateless)의 특징과 클라이언트의 요청에 맞는 응답을 보낸 후 연결을 끊는 비연결성 (Connectionless)의 특징을 가지고 있다.
- 장점 통신간의 연결 상태 처리나 상태 정보를 관리할 필요가 없어 서버 디자인이 간단하다. 각각의 HTTP 요청에 독립적으로 응답만 보내주면 된다.
- 단점 이전 통신의 정보를 모르기 때문에, 매번 인증을 하거나 쿠키나 토큰을 이용해 정보를 저장해야 한다.
HTTP에는 클라이언트와 서버간의 통신에 있어서 별다른 보안 조치가 없다. 만약 누군가 네트워크 신호를 가로챈다면 HTTP로 전달한 내용은 그대로 외부에 노출된다. 고객의 개인정보나 비밀을 취급하는 대규모 서비스라면 큰 보안적 허점이 되는 것이다. 이런 문제를 해결하기 위해 등장한 것이 HTTPS이다.
HTTPS
HTTPS 는 애플리케이션 계층과 전송 계층 사이에 신뢰 계층인 SSL/TLS를 넣은, 신뢰할 수 있는 HTTP 요청이다. HTTPS 가 제공하는 것들은 다음과 같다.
- 기밀성: HTTPS는 두 참여자간의 통신을 암호화하여 보호한다. ex) 와이파이 운영자가 개인 정보를 보지 못하게 함
- 무결성: HTTPS는 변조되지 않은 정보로 목적지에 도달하게 한다. ex) 와이파이 운영자가 웹사이트에 광고를 추가하지 못하게 함
- 인증: HTTPS를 통해 웹사이트의 진위 여부를 확인할 수 있다. ex) 와이파이를 통해 가짜 웹사이트를 브라우저에 보낼 수 있지만, https는 이를 검증한다.
SSL/TLS
SSL/TLS는 전송 계층에서 보안을 제공하는 프로토콜이다. 클라이언트가 서버와 통신할 때 SSL/TLS를 통해 제3자가 메시지를 도청하거나 변조하지 못하도록 한다.
SSL/TLS는 보안 세션을 기반으로 데이터를 암호화하며, 보안 세션이 만들어질 때 인증 메커니즘, 키 교환 암호화 알고리즘, 해싱 알고리즘이 사용된다.
보안 세션
보안 세션이란, 보안이 시작되고 끝나는 동안 유지되는 세션을 말하고, SSL/TLS는 핸드셰이크를 통해 보안 세션을 만들어 정보를 공유한다. 핸드셰이크의 과정은 다음과 같다.
- 클라이언트는 스키마가
https://
인 것을 확인하고, 브라우저의 SSL/TLS 버전, 브라우저가 지원하는 암호화 방식 모음(사이퍼 슈트), 임의의 난수 등을 보낸다. - 서버는 응답으로 브라우저가 보낸 사이퍼 슈트 중 사용할 암호화 방식, 공개키가 담긴 인증서, 임의의 난수를 담아 보낸다.
- 클라이언트는 인증서를 확인한 후, 자신과 서버가 생성했던 두 개의 난수를 가지고
premaster secret
을 만들고, 인증서에 있는 공개키로 암호화 해 보낸다. - 서버는 암호화 된 값을 비밀키로 복호화하고, 이를
master secret
으로 설정, 그리고 그 값으로session key
를 생성한다. 이 세션 키를 대칭키로 사용해 브라우저와 서버 사이에 주고받는 데이터를 암호화하고 복호화한다.
여기서 사이퍼 슈트란 데이터 암복호화에 사용할 프로토콜, AEAD 사이퍼 모드, 해싱 알고리즘이 나열된 집합을 말한다. 또, AEAD 사이퍼 모드는 데이터 암호화 알고리즘으로, AES_128_GCM 등이 있다.
암호화 알고리즘
HTTPS를 통해 전송할 데이터를 암호화 할 때 SSL/TLS에서는 키 교환 암호화 알고리즘을 사용한다. 대표적인 키 교환 암호화 알고리즘으로 ECDHE, DHE가 있는데, 둘 모두 DHE, 즉 디피-헬만 알고리즘 방식을 근간으로 사용한다.
디피-헬만 알고리즘은 암호키를 교환하는 하나의 방법으로, y = g^x mod p
의 식에서 g, x, p를 알면 y는 구하기 쉽지만, g, y, p를 알면 x는 구하기 어렵다.
라는 원리에 기반한 알고리즘이다.
위의 보안 세션 과정과 비교해 설명하자면, 처음에 공개 값을 공유(생성한 임의의 난수)하고, 각자의 비밀 값과 혼합한 후 그 값을 공유(premaster key), 그 혼합 값을 다시 비밀 값과 혼합하면 공통의 암호키(session key)를 얻을 수 있다.
예상 질문
- HTTP에 대해서 설명해주세요
답변
1. HTTP는 클라이언트와 서버가 요청과 응답의 형태로 데이터를 주고받기 위해 그 메시지의 형식을 규정해놓은 프로토콜입니다. 2. 특징으로는 연결이 종료되면 클라이언트의 상태를 유지하지 않는다는 무상태성, 요청에 대한 응답을 주면 연결을 종료한다는 비연결성이 있습니다. 3. 이 덕분에 각각의 HTTP 요청에 독립적으로 응답을 보낼 수 있어 설계가 간단해진다는 장점이 있지만, 이전의 통신 정보를 모르기 때문에 인증이 번거로워진다는 단점이 있습니다.- HTTPS는 HTTP와 어떻게 다른지 설명해주세요.
답변
1. HTTP는 통신 상대를 확인하지 않는 평문 통신이기 때문에 도청과 위장의 위험이 있습니다. 2. 이를 방지하기 위해 애플리케이션과 전송 계층 사이에 보안 계층으로 SSL/TLS 프로토콜을 삽입한 것이 HTTPS 입니다. 3. 이 보안 계층은 클라이언트가 인증서를 통해 웹사이트가 진짜임을 확인할 수 있도록 하고, 인증서에 포함된 공개키로 암호화에 쓰일 대칭키를 만들어 패킷을 암복호화하는 역할을 합니다.참고 자료
- HTTP vs HTTPS의 차이점을 알아보자
[TLS 핸드셰이크의 원리는 무엇일까요? SSL 핸드셰이크](https://www.cloudflare.com/ko-kr/learning/ssl/what-happens-in-a-tls-handshake/) - 디피 헬만 알고리즘(Diffie-Hellman Algorithm)
- 신입 개발자 기술면접 질문 정리 - 네트워크