# HTTPS

HTTPS 정의

애플리케이션 계층과 전송 계층 사이에 신뢰 계층인 SSL/TLS 계층을 넣은, 신뢰할 수 있는 HTTP 요청을 말합니다.
쉽게 말해, 통신을 암호화하는 것입니다.
HTTP/2가 HTTPS 위에서 동작합니다.

# SSL/TLS

  • SSL(Secure Socket Layer)은 SSL 1.0 부터 시작해서 SSL 2.0, SSL 3.0, TLS(Transport Layer Security Protocol)1.0, TLS 1.3 까지 버전이 올라가면 마지막으로 TLS로 명칭이 변경되었습니다.
  • 전송 계층에서 보안을 제공하는 프로토콜입니다.
  • 클라이언트와 서버가 통신할 때 SSL/TLS를 통해 제 3자가 메시지를 도청하거나 변조하지 못하도록 합니다.
  • ex) 공격자가 서버인 척하며 사용자 정보를 가로채는 인터셉터를 방지할 수 있습니다.
  • 보안 세션을 기반으로 데이터를 암호화하며 보안 세션이 만들어질 때 인증 메커니즘, 키 교환 암호화 알고리즘, 해싱 알고리즘이 사용됩니다.

# 보안 세션

  • 보안이 시작되고 끝나는 동안 유지되는 세션
  • SSL/TLS는 핸드셰이크를 통해 보안 세션을 생성하고 이를 기반으로 상태 정보 등을 공유합니다.

# SSL/TLS의 핸드셰이크

TLS의 핸드셰이크

  1. 클라이언트가 서버에 접속합니다. HTTP는 TCP의 일종이니, TCP연결을 위한 3-way handshake를 수행한 후 클라이언트는 HTTPS를 사용하는 서버에 다음 정보를 보냅니다.
    1. 브라우저가 사용하는 SSL/TLS 버전 정보
    2. 브라우저가 사용가능한 사이퍼 슈트(cypher suites) 목록
    3. 브라우저가 순간적으로 생성한 임의의 난수(숫자)
    4. 만약 이전에 SSL/TLS 핸드 셰이크가 완료된 상태라면, 그때 생성된 세션 아이디
    5. 기타 확장 정보
  2. 서버는 받은 사이퍼 슈트의 암호화 알고리즘 리스트를 제공할 수 있는지 확인합니다. 제공할 수 있다면, 리스트 중 선택한 사이퍼 슈트와 서버의 공개키가 담긴 SSL/TLS 인증서, 임의의 난수 등을 클라이언트에 제공합니다.
  3. 서버가 보낸 SSL/TLS 인증서를 내장된 CA 공개키로 복호화 하여 정상적인 인증서인지 확인합니다. 그 후, 자신이 생성한 난수와 서버의 난수를 사용하여 premaster secret을 만들어 전송합니다.
  4. 클라이언트가 보낸 premaster secret를 서버의 비밀키로 복호화하고 복호화 한 값을 master secret 값으로 저장합니다. 그 다음, master secret 값을 이용하여 session key를 생성합니다.
  5. SSL/TLS handshake가 정상적으로 완료되어 session key를 사용하여 암호화/복호화하며 통신을 주고 받습니다.

사이퍼 슈트(cypher suites)

사이퍼 슈트는 프로토콜, AEAD 사이퍼 모드, 해싱 알고리즘이 나열된 규약을 말하며, 다섯개가 있습니다.

  • TLS_AES_128_GCM_SHA256 : TLS 프로토콜, AEAD 사이퍼 모드가 AES_128_GCM이고 SHA256 해싱 알고리즘을 가진다는 의미입니다.
  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_CCM_SHA256
  • TLS_AES_128_CCM_8_SHA256

0-RTT

TLS 1.3은 사용자가 이전에 방문한 사이트로 다시 방문한다면 SSL/TLS에서 보안 세션을 만들 때 걸리는 통신을 하지 않아도 됩니다. 이를 O-RTT라고 합니다.

# 인증 메커니즘

  • CA(Certificate Authorities)에서 발급한 인증서를 기반으로 이루어집니다.
  • '공개키'를 클라이언트에 제공하여 사용자가 접속한 서버가 신뢰할 수 있는 서버임을 보장해줍니다.
  • 인증서는 서비스 정보, 공개키, 지문, 디지털 서명 등으로 이루어져 있습니다.
  • 참고로, CA는 신뢰성이 엄격하게 공인된 기업들만 참여할 수 있으며, Comodo, GoDaddy, 아마존 등이 있습니다.

# CA 발급과정

자신의 서비스가 CA 인증서를 발급받으려면 자신의 사이트 정보와 공개키를 CA에 제출해야 합니다. 이후 CA는 공개키를 해시한 값인 지문(finger print)을 사용하는 CA의 비밀키 등을 기반으로 CA인증서를 발급합니다.

# 키 교환 암호화 알고리즘

  • ECDHE(Elliptic Curve Diffie-Hellman Ephermeral), DHE(Diffie-Hellman Ephermeral)를 사용합니다.
  • 두 방식 다 디피-헬만(Diffie-Hellman) 방식을 근간으로 만들어졌습니다.

용어

개인키 : 비밀키라고도 하며, 개인이 소유하고 있는 키이자 반드시 자신만이 소유해야 하는 키
공개키 : 공개되어 있는 키

# 디피-헬만 키 교환 암호화 알고리즘

상대방의 공개키와 나의 개인키를 이용하여 계산을 하면 비밀키가 나온다는 것을 이용한 암호화 알고리즘입니다.

  • 원리 : 디피헬만
    위 식에서 g와 x와 p를 안다면 y는 구하기 쉽지만 g와 y와 p만 안다면 x를 구하기는 어렵다는 원리에 기반한 알고리즘입니다.

  • 방식
    디피헬만키교환암호화알고리즘
    위의 그림처럼 처음에 공개 값을 공유하고 각자의 비밀 값과 혼합한 후 혼합 값을 공유합니다. 그 이후, 각자의 비밀 값과 또 혼합한 후에 공통의 암호키를 갖는 것입니다.

# 해싱 알고리즘

  • 데이터를 추정하기 힘든 더 작고, 섞여 있는 조각으로 만드는 알고리즘입니다.
  • SSL/TLS는 해싱 알고리즘으로 SHA-256 알고리즘과 SHA-384 알고리즘을 사용합니다.

# SHA-256 알고리즘

  • 문자열을 무슨 뜻인지 알아볼 수 없는 문자열로 변환해 줍니다.
  • SHA-256알고리즘은 해시 함수의 결괏값이 256비트인 알고리즘입니다.
  • 해싱을 해야 할 메시지에 1을 추가하는 증 전처리를 하고 전처리된 메시지를 기반으로 해시를 반환합니다.
  • SHA-256 사이트 (opens new window)

용어

해시 : 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑(mapping)한 값
해싱 : 임의의 데이터를 해시로 바꿔주는 일이며 해시 함수가 이를 담당
해시 함수 : 임의의 데이터를 입력으로 받아 일정한 길이의 데이터로 바꿔주는 함수

# SEO와 HTTPS

구글은 HTTPS를 사용하는 사이트가 그렇지 않은 사이트보다 SEO 순위가 높을 것이라고 밝혔습니다.

SEO란?

Search Engine Optimization으로 검색엔진 최적화를 뜻하며 사용자들이 구글, 네이버 같은 검색엔진으로 웹 사이트를 검색 했을 때 그 결과를 페이지 상단에 노출시켜 많은 사람이 볼 수 있도록 최적화하는 방법을 의미합니다.

# SEO 관리 방법

  1. 캐노니컬 설정
  2. 메타 설정
  3. 페이지 속도 개선
  4. 사이트맵 관리

# HTTPS 구축 방법

  • CA에서 구매한 인증키를 기반으로 HTTPS 서비스를 구축
  • 서버 앞단에 HTTPS를 제공하는 로드밸런서 사용하기
  • 서버 앞단에 HTTPS를 제공하는 CDN을 사용하기

# 참고자료

  • 주홍철.면접을 위한 CS 전공지식 노트.서울:길벗,2022.
  • https://brunch.co.kr/@sangjinkang/38
  • https://luniverse.io/2021/03/18/diffie-hellman-key-exchange/?lang=ko