<관련 포스팅>
[네트워크] HTTP 버전 차이(0.9/1.0/1.1/2.0/3.0)

HTTPS

특징

  • HTTPS란 애플리케이션 계층과 전송 계층 사이에 신뢰 계층인 SSL/TLS 계층을 넣은 신뢰할 수 있는 HTTP 요청을 말함
  • 이를 통해 ‘통신을 암호화’함
  • HTTP/2는 HTTPS 위에서 동작함

 

SSL/TLS(Secure Socket Layer/Transport Layer Security)

  • TLS와 SSL은 동일한 의미를 가진 단어로, TLS가 SSL의 새로운 버전이라고 생각하면 됨
  • SSL/TLS는 전송 계층에서 보안을 제공하는 프로토콜
  • 네트워크로 통신하는 과정에서 도청, 간섭, 위조를 방지하기 위해 설계됨
  • 보안 세션을 기반으로 데이터를 암호화하며 보안 세션이 만들어질 때 인증 메커니즘, 키 교환 암호화 알고리즘, 해싱 알고리즘이 사용됨

 

보안 세션

  • 세션이란 운영체제가 어떠한 사용자로부터 자신의 자산 이용을 허락하는 일정한 기간을 뜻함
  • 보안 세션이란 보안이 시작되고 끝나는 동안 유지되는 세션
  • SSL 핸드셰이크를 통해 보안 세션을 생성하고 이를 기반으로 상태 정보 등을 공유

 

인증 메커니즘

  • CA(Certificate Authorities)에서 발급한 인증서를 기반으로 이루어짐
  • CA에서 발급한 인증서는 안전한 연결을 시작하는 데 있어 필요한 ‘공개키’를 클라이언트에 제공하고 사용자가 접속한 서버가 ‘신뢰할 수 있는’ 서버임을 보장함
  • 인증서는 서비스 정보, 공개키, 지문, 디지털 서명 등으로 이루어져 있음
  • CA는 신뢰성이 엄격하게 공인된 기업들만 참여할 수 있음

 

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

  • 암호키를 교환하는 하나의 방법

$$ y = g^x mod p $$

  • g와 x와 p를 안다면 y는 구하기 쉽지만, g와 y와 p만 안다면 x를 구하기는 어렵다는 원리에 기반한 알고리즘
  • 처음에 공개 값을 공유하고 각자의 비밀 값과 혼합한 후 혼합 값을 공유함
  • 그다음 각자의 비밀 값과 또 혼합하면 공통의 암호키가 생성되는 것
  • 클라이언트와 서버 모두 개인키와 공개키를 생성하고 서로에게 공개키를 보내고 공개키와 개인키를 결합하여 PSK(사전 합의된 비밀키)가 생성됨

 

해싱 알고리즘

  • 해시란 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑한 값
  • 데이터를 추정하기 힘들도록 더 작고, 섞여있는 조각으로 만드는 알고리즘
  • 비트 코인을 비롯한 많은 블록체인 시스템에서도 사용함

 


SSL Handshake(5-way handshake)

대칭키/공개키 암호화에 대한 사전 지식이 필요합니다.

요약

  • 클라이언트와 서버가 키를 공유하고 이를 기반으로 인증, 인증 확인 등의 작업이 일어나 한 번의 1-RTT가 생긴 후 데이터를 송수신함
  • 클라이언트가 서버로 사이퍼 슈트(프로토콜과 해싱 알고리즘 등이 나열된 규약)를 전달하면 서버는 그 암호화 알고리즘 리스트 중 제공할 수 있는 것을 확인함
  • 서버에서 클라이언트로 인증서를 보내는 인증 메커니즘이 시작되고 이후 해싱 알고리즘 등으로 암호화된 데이터의 송수신이 시작됨

⇒ 대칭키는 공개키에 비해 빠르지만 키 배송 문제가 존재하기 때문에, SSL 핸드쉐이킹 과정에서는 Key를 공유하기 위해 공개키 방식을 사용하고, 세션이 형성된 후에는 대칭키 방식으로 효율을 높임

 

핸드쉐이크 과정

 

  1. ClientServer: Client Hello
    • 클라이언트는 랜덤한 데이터와 현재 지원가능한 암호화 방식을 서버에게 전달
    • 자신의 능력을 서버에게 말해주는 과정
  2. ServerClient: Server Hello
    • 서버는 세 가지 데이터로 응답함
    • (1) 인증서 with 공개키
      (2) 서버에서 생성한 랜덤한 데이터
      (3) 가장 안전한 암호화 수단 방식
    • 암호화 수단 방식은 클라이언트가 지원가능한 암호화 방식 목록 중 선택함
  3. Client: 인증서 확인
    • 클라이언트는 내장되어있는 CA 리스트에서 각 CA의 공개키를 이용하여 서버가 보낸 인증서를 복호화
    • 만약 CA 리스트에 없는 인증서라면 사용자에게 경고 메세지 표시하고, 복호화에 성공하면 시 해당 서버를 신뢰하게 됨
    • 클라이언트가 전송한 랜덤한 데이터서버가 전송한 랜덤한 데이터를 조합하여 Pre Master Secret 키를 생성
  4. ClientServer: 시크릿 키를 서버에 전송
    • 이 때 시크릿 키는 절대 노출되어서는 안됨
    • 2번에서 받은 공개키를 사용하여 Pre Master Secret 키를 암호화하여 서버로 전송
  5. Server: 시크릿 키 복호화
    • 서버는 이 시크릿 키값을 자신의 비밀키로 복호화함
    • 이로써 클라이언트와 서버는 시크릿 키를 공유하게 됨
  6. Server: 세션키(대칭키) 생성
    • Pre Master Secret 값을 Master Secret 값으로 만듦
    • Master Secret 값을 이용하여 Session Key를 만듦
  7. ClientServer: 세션 형성
    • 클라이언트와 서버 간의 세션이 형성되고, 세션키를 이용하여 암호화하여 데이터를 주고받음
    • 대칭키 방식을 활용하는 것

 


References

+ Recent posts