HTTPS
HTTP over SSL / HTTP Secure
- HTTP를 기반으로 통신을 하는데 그 전에,
암호화된 데이터로 통신할 수 있도록 협의 과정(handshake)을 거쳐, 통신 간에 보안을 강화한다.
- 협의 과정에서 쓰이는 프로토콜이 주로 SSL이다.
- 결과적으로, 기존 HTTP의 평문 데이터가 아니라
협의 결과(비밀키)를 통해 암호화된 데이터를 주고 받아 통신한다.
- HTTP에 비해, 사용한다는 것 자체 만으로도 resource가 필요하므로 처리가 느리다.
- HTTP로 주고받는 데이터는 평문인데 반해,
HTTPS로 주고받는 데이터는 암호화되어있기 때문에 암호화 및 복호화하는 과정에 대해
서버 및 클라이언트에서 resource가 필요하기 때문이다.
- SSL handshake 과정에 대해서도 network resource가 필요하다.
- SSL handshake는 클라이언트가 서버의 SSL인증서를 받고
비밀키를 교환하기까지의 과정을 말한다.
(cipher suite을 통해 데이터를 암호화할 알고리즘도 협의 사항에 포함한다)
- 개인 정보 등의 민감한 정보를 다루는 등, 필요한 곳에서만 사용하는 게 보편적이다.
- HTTPS도 HTTP에서의 TCP 계층의 3-way-handshake를 쓴다.
물론, SSL handshake 전이다.
- TCP 3-way-handshake는 클라이언트와 서버 간의 연결을 확립하기 위한 것이다.
- HTTPS는 공개키 암호화 방식과 비밀키 암호화 방식을 둘 다 사용한다.
- 비밀키를 안전하게 교환하기 위해서 공개키 암호화 방식을 사용하고,
비밀키를 안전하게 교환했으면 이젠 비밀키를 통해 데이터를 암호화하여 사용한다.
- 실제 데이터를 주고 받기에 공개키 암호화 방식만으로는 너무 느리기 때문이다.
HTTPS flow
- 서버 측에서는 자신이 진짜임을 증명하기 위해 인증기관으로부터 SSL 인증서를 발급받아야한다.
그러기 위해 한 쌍의 공개키와 개인키를 생성하고,
사이트 정보와 자신의 공개키를 인증기관에게 전달해서 SSL 인증서 생성을 요구한다.
- 인증기관은 해당 서버에 대한 검증을 거친 후,
한 쌍의 공개키와 개인키를 생성하여 (아마 최초 한 번)
자신의 '개인키'로 해당 사이트 정보와 ‘서버의’ 공개키를 '암호화'하여 (이를 '서명'이라고 한다.)
서버에 SSL인증서를 전달한다.
(이 때, 인증 기관의 공개키는 보통 웹 브라우저에 내장되어 있다.)
그렇게 서버는 발급 받은 SSL인증서를 게시해 놓는다.
- 클라이언트가 최초에 서버로부터 SSL인증서를 획득한다.
그리고 그 SSL인증서를 통해 서버가 진짜인지(인증기관의 서명이 있는지)
인증기관의 '공개키'를 통해 해당 SSL인증서를 '복호화'를 시도해봄으로써 검증하려고 한다.
- 복호화를 통해 클라이언트는 해당 서버가 진짜인지와 서버의 공개키를 얻게 되고
실제 데이터 암호화에 사용할 '비밀키'를 암호화하여 서버에게 전송한다.
- 서버는 클라이언트가 보낸 데이터(비밀키)를 자신의 개인키로 복호화한다.
그래서 해당 클라이언트와 서버는 동일한 비밀키를 갖게 되어
이후, 실제 데이터를 비밀키로 암호화하여 안전한 통신이 가능해진다.
공개키(비대칭키) 암호화 방식
- 주로 암호화할 때 쓰는 키인 공개키는 각자 공개하며,
주로 복호화할 때 쓰는 키인 개인키는 각자 비밀로 한다.
이렇게 한 쌍의 키는, 각자에게 유일하다.
(수신자 및 발신자는 서로 역할에 따라 서버가 되기도, 클라이언트가 되기도 한다.)
- 발신자는 수신자의 공개키로 암호화하여 데이터를 보내고,
수신자는 자신의 개인키를 통한 복호화로 올바른 데이터를 취할 수 있다.
즉, 발신자가 수신자의 공개키로 암호하여 보낸 데이터는
수신자의 공개키가 아닌 개인키를 통해서만 올바른 데이터로 취할 수 있다.
- 그래서 비밀키(대칭키) 암호화 방식과 달리 별도의 키 교환이 불필요하며,
암호화된 데이터를 수신할 수 있도록 공개키를 공개하기만하고, 개인키는 비밀로 한다.
- HTTPS로 클라이언트와 서버 간의 비밀키 교환에 사용한다.
비밀키(대칭키) 암호화 방식
- 암호화 및 복호화에 동일한 하나의 키를 사용하는 것이다.
- HTTPS로 클라이언트와 서버 간의 실제 데이터 교환 시에 사용한다.