개요


HTTPS는 HTTP 프로토콜에 SSL/TLS 프로토콜이 가미된 프로토콜이다.(HTTP over SSL/TLS)

일반 HTTP는 보안이 취약해 보안을 위한 SSL/TLS라는 레이어를 추가로 둔 것이다.

전송하는 HTTP 데이터를 모두 암호화하기 때문에 중간에 누군가 가로채더라도 데이터가 노출될 위험이 매우 적다.

SSL과 TLS 차이

SSL이 폭넓게 사용되다가 표준화 기구인 IETF의 관리하에 들어가며 TLS라는 이름으로 바뀐 것. TLS는 가장 최신 기술로 더 강력한 버전의 SSL을 의미하지만 SSL이 더 일반적으로 사용되는 용어.

(SSL/TLS는 전송 계층의 프로토콜이다. 그리고 얘네가 HTTP에 적용된 것이 HTTPS이다.) (SSL/TLS가 HTTP에만 적용되는건 아니고 SMTP 같은 프로토콜에 적용시킬 수도 있다고 함.) (rfc5246 : TLS 문서)

HTTPS 서버를 구성하는 방법은 간단하다. 우선 어떻게 기존의 HTTP 서버로부터 HTTPS 서버를 구성하는지 간단하게 알아보고, 이후 좀 더 자세한 원리를 알아보자.

  1. 믿을 수 있는 CA(Certificate Authority)로부터 SSL/TLS 인증서를 발급받는다. 이때 도메인 이름, 조직 이름, 위치 등의 정보를 제공해야 한다. 보통 IP 주소가 아닌 Domain name을 기준으로 인증서를 발급받는다. 왜냐하면! (1) ip 주소는 동적으로 변경될 수 있기 때문에 신뢰성을 보장하기 어렵다. 고정된 공인 ip를 할당 받는 경우가 많겠지만 ISP에 의해 유동적으로 ip를 할당받는 컴퓨터도 있기 때문이다. 또 가상호스팅 등으로 인해 한 ip에서 여러 도메인을 운용하는 경우도 있기 때문에 도메인 네임을 기준으로 발급받는 경우가 많다. ip로 발급받으려면 복잡하다고 함. (2) 인증서 발급 과정에 소유권을 검증하는데, 도메인 이름은 소유권이 등록돼있으므로 이를 확인하기 편하다. → 대형기업이나 정부기관에선 ip 주소로 인증서를 발급받는 경우도 있다고 한다.
  2. 발급받은 인증서를 서버에 저장/설치한다. 대부분 서버 프로그램/프레임워크(ex. nginx, nestjs, …)는 이렇게 인증서 설치하는 작업을 지원해준다, 요청이 들어왔을 때 해당 인증서를 이용하도록 설정하는 작업이다. (그리고 이렇게 설치만 해두면 내부적으로 HTTPS 통신을 잘 처리해준다.)
  3. 443 포트(HTTPS 기본 포트)로 요청을 처리하도록 설정한다.
  4. HTTP 요청을 HTTPS 로 리다이렉트 시킨다. → 클라이언트는 항상 HTTPS로 안전하게 접속하게 된다.
  5. (추가) 추가적인 보안 강화를 위해 HSTS(HTTP Strict Transport Security)를 설정할 수 있다. HSTS는 웹 서버가 브라우저에게 이 사이트는 앞으로 HTTPS만 사용하라고 알리는 기능이다.

Q. 연결된 서버 없이 Domain name만으로도 인증서를 발급받을 수 있을까? A. SSL/TLS 인증서는 Domain name을 기준으로 발급받을 수 있기 때문에 서버 구현 같은거 없이도 인증서를 발급받을 순 있다. 실제로 가비아에서 도메인을 구매한 후 sslforfree.com 을 통해 인증서를 발급받아봤는데 아무 문제 없었다. 다 그런건 아니고 letsencrypt 같은 데는 연결된 공인 ip에 서버가 띄워져있어야 인증/발급을 받을 수 있다고 함.

이렇게 인증 기관으로부터 인증서를 발급받는 등 TLS를 이용하면 “신뢰 가능한 통신”을 할 수 있다. 어떻게 신뢰 가능한 통신을 제공하는지 대략적으로 알아보자.

1. TLS는 기본적으로 대칭키/비대칭키 방식을 혼합해 사용하여 오고 가는 메시지를 암호화한다. 따라서 중간에 도청하는 해커가 있든 말든 믿고 메시지를 보낼 수 있다!

그런데 메시지를 암호화하는 것만으로 충분하지 않다. 내가 메시지를 보내는 대상이 해커라면? 민감한 데이터(ex. 비밀번호)를 해커에게 보내는 꼴이 돼버린다.

2. TLS/SSL은 통신 초반에 **“인증서”**라는 것을 서버에서 보내도록 한다. 클라이언트는 이 인증서로 믿을만한 상대인지 판단하고 메시지를 보낼 수 있다. 인증서는 보통 별도의 공신력있는 기관에서 발급받는다.(이론상으론 스스로 해도 된다곤 하던데 과연 어떤 클라이언트가 믿어줄지는 모름ㅋㅋ) 인증서 발급 기관에서 도메인의 주인에 대한 검증을 거치고! 서버에서 사용할 수 있게 인증서를 발급해주는 것이다. 인증서 발급 기관에 따라 인증 절차 수준도 다르기 때문에 인증서에도 급(?)이 있다.(”인증서”만 있으면 https 통신 자체에는 아무 문제는 없지만, 웹 브라우저가 안전성이 높지 않다고 판단할 수 있다.)