대칭키와 공개키, 브라우저와 서버의 통신에 대해 전반적으로 아우를 수 있는 주제인 HTTP와 HTTPS를 정리해보았다.
HTTP와 HTTPS
HTTP(HyperText Transfer Protocol)란?
- OSI 7계층에서 가장 상위인 응용 계층(Application Layer)의 프로토콜, 즉 규약이다.
- 전 세계의 모든 웹브라우저, 웹서버, 웹애플리케이션은 이 규약을 통해 통신한다.
- 이 포스팅을 쓰기 위해 참고한 <HTTP 완벽 가이드>의 부제도 ‘웹은 어떻게 동작하는가’인 걸 보면 알 수 있듯이 HTTP는 모든 웹의 통신규약이다.
- 신뢰성 있는 데이터 전송 프로토콜을 사용하므로 전송되는 데이터의 유실이나 손상을 걱정하지 않아도 된다.
- 전송할 데이터의 타입을 식별하도록 데이터 포맷 라벨을 붙이고(MIME 타입), 요청 명령(HTTP 메서드)과 응답 결과(상태 코드)로 구성된 트랜잭션을 수행하도록 해준다.
- 궁극적으로 (html 문서 등 웹브라우저에서 필요로하는 리소스) 데이터를 교환하게 해주는 통신규약이다.
HTTPS(HTTP over SSL)란?
- HTTP를 통해 오가는 데이터는 중간에서 가로채 접근하거나 변경할 수 있다는 큰 보안상의 취약점이 있다.
- 예컨대 로그인을 위해 내가 아이디와 비밀번호를 입력했다면 그 데이터가 그대로 전송되기 때문에 누군가가 악의적으로 접근하여 알아낸 정보로 로그인 하여 나를 사칭하기도 할 수 있는 것이다.
- 이를 막기 위해서는 오가는 데이터를 가로채더라도 뜻을 알아낼 수 없는, 암호화된 형태여야 한다.
- SSL로 암호화된 결과물의 데이터를 통신하는 것이 바로 HTTPS이며 HTTP(80)와는 다른 포트번호(443)를 써서 구분한다.
- 표현 계층(Presentation Layer)에서 SSL이라는 프로토콜을 준수하는 방식으로 암호화 과정을 거친 데이터를 보낸다고 생각하면 된다.
SSL(Secure Socket Layer) 인증서란?
- 클라이언트에게는 해당 서버가 의도한 목적지임을 보증하고, 서버에게는 공개키를 발급하여 보낼 수 있는 도구이다.
SSL 인증서와 CA
- CA(Certificate Authority)로 지정된 민간기업이 신뢰성있는 사업체를 대상으로 SSL인증서를 발급해주면, 해당 사업체는 자신의 서버에서 클라이언트의 요청에 SSL 인증서를 뿌릴 수 있다.
- 브라우저는 신뢰할 수 있는 CA의 목록을 가지고 있으며, 이 CA에서 발급된 SSL 인증서를 가진 서버에 대해서는 안전하다는 표시를 해준다.
- 브라우저의 CA 리스트에 없는 CA도 여전히 SSL 인증서를 발급할 수는 있다.
- 인증서에는 서버의 공개키와 인증기관(CA)의 정보 등이 들어있다.
SSL을 통한 데이터 암호화
- 서버는 비밀키로 암호화한 메시지를 보내며, 클라이언트는 SSL 인증서에 담긴 공개키로 이를 복호화함으로써 그 서버가 SSL 인증서에 있는 서버임을 알 수 있다.
- SSL 인증서에서의 공개키는 암호보다 신원보증의 맥락에서 의미있는 것이다.
- 공개키와 비밀키로 암호화를 하는 것은 리소스 소모가 더 크므로, 클라이언트와 서버는 대칭키를 SSL 인증서의 공개키 방식으로 전달한다.
- 공개키로 암호화된 대칭키를 받은 서버는 이를 자신이 가진 비밀키로 복호화하고, 그러면 클라이언트와 서버는 안전하게 같은 대칭키를 나눠가진 것이므로 그 때부터는 대칭키로 암호화된 데이터를 통신할 수 있는 것이다.
느낀 점
- HTTPS를 통해 엄청난 보안 상의 도약이 이루어졌다는 게 이제야 와닿는다.
- 사람들 머리 좋다…