CS지식

HTTPS 개념을 잡고 가자..(feat. SSL/TLS을 곁들인)

indeep 2024. 3. 16. 13:20

HTTP : 하이퍼 텍스트 전송 프로토콜

(여기서는 HTTPS를 위해 간단하게 넘어가겠습니다.)

 

HTTP -> 데이터가 평문으로 전송된다. 즉 패킷 도청으로 데이터 유출 가능성이 생김(보안상으로 매우 위험)

그래서 우리는 Security가 추가된 HTTPS를 사용하게 됩니다.

 

HTTPS

  • 데이터 전송의 보안을 강화하기 위해 사용
  • SSL/TSL 프로토콜을 통해 데이터 암호화

 

간단 정리

HTTP의 보안 문제를 해결하기 위해 SSL/TLS를 추가한 HTTPS를 사용한다.

그러면 HTTPS를 설정하는 과정, 데이터를 암호화해서 주고받는 과정에 대해 정리를 해보려고 합니다.

 

SSL의 개념

  • Secure sockets layer의 약어(보안 소켓 계층)
  • 전송되는 데이터를 암호화하는 표준 기술

TLS의 개념

  • Transport Layer Security의 약어(전송 계층 보안)
  • SSL의 향상 버전.
  • SSL 용어를 많이 써서 SSL로 언급하지만, 대부분 최신 TLS 인증서 제공.

결국 SSL의 최신이 TLS이며, 용어는 SSL/TLS로 사용한다.

 

서버에서 SSL 인증서를 받아보자.

  1. 먼저 서버는 본인의 공개키, 비밀키를 생성한다.(비대칭키)

  2. CA( Certificate Authority, 인증기관 )한테 본인의 공개키, 서버정보를 담은 CSR( Certificate Signing Request ) 전송
    즉 나 이런 정보 줄테니 SSL 인증서 만들어주세요~ 라는 요청서
  3. CA는 서버의 공개키, 정보를 해시값으로 변경하여 CA의 비밀키로 암호화를 진행한다. -> FingerPrint(지문) 생성

  4. CA는 지문, 서버 정보, 서버 공개키, CA 정보를 묶어서 하나의 SSL 인증서를 생성하고 서버에게 발급.

 

여기서 비대칭키와 대칭키의 개념이 계속 나올텐데, 이 부분은 내용을 찾아보시면 됩니다.
간단하게만 집고 넘어가면

대칭키 -> 하나의 키로 구성되며 키 하나로 암호화, 복호화가 전부 가능.

비대칭키 -> 두 개의 키로 구성되며 A로 암호화, B로 복호화 또는 B로 암호화, A로 복호화 이렇게만 가능합니다.

즉 SSL인증서는 CA의 비밀키로 암호화했으니, CA의 공개키로만 복호화가 가능합니다.

 

클라이언트가 서버로 요청을 보내봅시다.

이때, SSL/TLS 핸드쉐이크 과정이 시작됩니다.

  1.  클라이언트 헬로 : 클라이언트가 서버에게 접속 요청을 보내면, 본인이 지원하는 암호화 알고리즘 목록, 기타 정보, 클라이언트 랜덤(문자열)을 서버로 전송합니다.

  2. 서버 헬로 : 서버는 요청을 받아서, 클라이언트와 서버가 지원하는 알고리즘 선택, 기타 정보, 서버 랜덤(문자열)을 SSL 인증서와 함께 전송합니다.

    여기까지 진행되면 클라이언트는 서버의 SSL 인증서를 가지고 있습니다.SSL 인증서가 제대로 된 CA에서 발급 받은 내용인지 검증을 진행해야 합니다.

  3. 인증서 검증 : 브라우저는 주요 인증기관의 리스트와 공개키를 가지고 있습니다.(즉 목록을 이미 보유함)
    해당 SSL 인증서 기관에 맞는 공개키를 찾아서 SSL 인증서 복호화를 진행합니다. 그러면 서버 공개키를 확보하게 됩니다.

  4. 프리마스터 시크릿 생성 및 전송 : 임의의 문자열을 생생하여 서버의 공개키로 암호화를 진행하여 서버에게 전송
    이 문자열은 추후에 세션 키를 생성하는 데 사용됩니다.

  5. 프리마스터 시크릿 복호화 : 서버는 본인의 비밀키로 프리마스터 시크릿을 복호화하여 얻습니다.

  6. 세션키 생성 : 클라이언트와 서버는 전부 클라이언트 랜덤, 서버 랜덤, 프리마스터 시크릿을 가지고 있습니다.
    이 3가지 정보를 합쳐서 동일한 세션 키를 생성합니다.(세션 키는 데이터 암호화, 복호화에 계속 사용됩니다.)

 

자 이 과정까지 거치면 현재 핸드쉐이크가 끝나고, 서버의 검증이 완료된 상태입니다.

클라이언트 : 세션키 보유, 서버 SSL 검증 완료
서버 : 세션키 보유

 

이제 진짜 데이터를 보내봅시다.

  1. 클라이언트가 데이터 전송 : request를 생성해서 세션 키로 암호화를 진행합니다.

  2. 서버 데이터 응답 : request를 받아서 세션키로 복호화를 진행합니다. 이후 데이터 처리하여 response를 만들어 세션키로 암호화를 진행합니다.

  3. 클라이언트 처리 : response를 받아서 세션키로 복호화를 진행하여 데이터를 처리합니다.

이렇게 세션이 유지되는 동안 세션 키를 사용해서 데이터를 안전하게 전송합니다.

세션이 종료되면 그 즉시 세션 키는 폐기합니다!

 

SSL을 사용만 해봤지, 이렇게 과정을 이해하고 나니깐 왜 SSL을 써야하는지 명확하게 알게 되었습니다.

최대한 공식 자료를 통해 글을 작성했으나, 틀린 내용이 있다면 언제든지 댓글 부탁드리겠습니다.

 

반응형