Appearance
HTTP & HTTPS
HTTP(HyperText Transfer Protocol)
웹에서 클라이언트와 서버가 자원(resource)과 그 표현(representation)을 주고받기 위한 애플리케이션 계층 프로토콜이다.
HTTP는 버전에 따라 전송 방식이 다르다.
HTTP/1.1: 텍스트 기반 메시지 형식HTTP/2: 바이너리 프레임 기반, 멀티플렉싱 지원HTTP/3: QUIC(UDP 기반) 위에서 동작
즉, HTTP = 텍스트 프로토콜이라고만 설명하면 현재 기준으로는 부정확하다. 텍스트 기반인 것은 주로 HTTP/1.1 메시지 형식이다.
HTTP 자체는 stateless한 요청/응답 프로토콜이며, 암호화는 HTTP의 본질이 아니라 그 아래 계층인 TLS가 담당한다.
HTTP를 그대로 사용할 때의 보안 문제
TLS 없이 HTTP를 사용하면 다음 문제가 생길 수 있다.
- 도청
- 평문 전송이므로 중간에서 내용을 볼 수 있다.
- 위장
- 서버가 진짜 대상 서버인지 검증할 수 없다.
- 변조
- 전송 중 데이터가 바뀌어도 이를 안전하게 검증하기 어렵다.
HTTPS(HyperText Transfer Protocol Secure)
HTTPS = HTTP over TLS 이다.
- 예전의
SSL은 더 이상 현대 웹에서 권장되지 않는다. - 현재는 주로
TLS 1.2또는TLS 1.3을 사용한다. TLS 1.0과TLS 1.1은 폐기(deprecated)되었다.
HTTPS는 "텍스트만 암호화"하는 것이 아니라, HTTP 메시지와 본문을 포함한 전송 데이터 전체를 TLS로 보호한다.
HTTPS가 제공하는 핵심은 다음과 같다.
- 기밀성(Confidentiality): 내용을 엿보기 어렵게 함
- 무결성(Integrity): 중간 변조를 탐지할 수 있게 함
- 인증(Authentication): 서버가 신뢰 가능한 인증서 체인을 제시했는지 검증
필요한 경우에는 클라이언트 인증서 기반 mTLS로 상호 인증도 할 수 있다.
HTTPS 통신 흐름
서버는 자신의 공개키에 대한 소유권을 증명할 수 있도록
인증서 체인을 준비한다.클라이언트가 HTTPS 연결을 시작하면 TLS 핸드셰이크가 먼저 수행된다.
서버는 자신의 인증서를 보낸다.
클라이언트는 브라우저/OS의 신뢰 저장소에 있는 CA 공개키들로 인증서 체인을 검증한다.
- 올바른 CA가 서명했는지
- 인증서가 만료되지 않았는지
- 접속한 도메인 이름과 인증서의 이름이 일치하는지
현대 TLS(특히 TLS 1.3)에서는 보통
(EC)DHE기반 키 교환으로 양측이 공유 비밀을 만든다.이 공유 비밀로부터 대칭키들을 파생하고, 이후 실제 HTTP 데이터는 대칭키(AES-GCM, ChaCha20-Poly1305 등)로 보호한다.
세션이 종료되면 해당 연결에 사용한 트래픽 키도 더 이상 사용하지 않는다.
중요한 점은, 현대 TLS에서 서버 인증서의 공개키는 주로 서버 신원 증명에 사용되고, 예전처럼 pre-master secret을 RSA로 직접 암호화해 전달하는 방식은 TLS 1.3에서 제거되었다는 것이다.
HTTPS도 만능은 아니다
HTTPS를 써도 다음 문제는 별개다.
- 서버 자체가 침해된 경우
- 애플리케이션 취약점(XSS, SQL Injection 등)
- 잘못 발급되었거나 신뢰할 수 없는 인증서
- 사용자가 경고를 무시하고 자체 서명 인증서를 수락한 경우
- 콘텐츠 일부가 여전히 HTTP로 로드되는 mixed content
참고사항
- RFC 9110, RFC 9112, RFC 9113, RFC 9114
- RFC 8446, RFC 8996