HTTPS 통신 프로세스

컴업·2024년 7월 1일
0
post-thumbnail
post-custom-banner

크롬 주소창에 https://www.naver.com을 입력하면 무슨일이 발생할까?

한 때 면접 단골 질문으로 유명했던 질문이다.

이 질문에 좀 더 길게 답변할 수 있도록(?) https 통신 프로세스에 대하여 정리해 보았다.

🤔 HTTPS란?

HTTPS는 HyperText Transfer Protocol Secure의 약자로, 인터넷 상에서 데이터를 안전하게 전송하기 위해 HTTP에 데이터 암호화를 추가한 프로토콜이다.
HTTPS는 HTTP에 비해 보안적으로 강화된 통신 방식을 제공하는데, 두 가지 중요한 이점이 있다.

1. 데이터 암호화

HTTPS는 데이터를 암호화하여 전송한다. 이는 만약 데이터가 도중 탈취되더라도, 탈취자가 그 내용을 읽을 수 없게 만든다. 이 암호화 과정에서 대칭키와 비대칭키가 사용된다.

  • 대칭키: 하나의 키로 데이터를 암호화하고 동일한 키로 복호화한다. 이 키는 세션 동안 클라이언트와 서버만이 공유하며, 세션 키라고도 한다.

  • 비대칭키: 한 쌍의 키를 사용한다. 하나는 공개키로 누구에게나 공개될 수 있고, 다른 하나는 개인키로 서버에만 저장되어 있다. 공개키로 암호화된 데이터는 개인키로만 복호화할 수 있다. (그 반대로 사용할 수 도 있음.)

2. 서버 인증

HTTPS는 특정 웹 사이트가 진짜 그 조직의 정식 사이트인지 검증한다.

예를 들어, "신한은행" 사이트가 실제로 신한은행의 공식 사이트인지를 Certificate Authority(CA)라고 불리는 공인된 기관에서 검증해준다.
신한은행에서 만든 사이트는 자신이 신한은행임을 CA 기관에 증명하여 인증을 받아야한다.
이 과정을 통해 "신은행"과 같은 피싱 사이트는 HTTPS 통신을 사용할 수 없게 된다.

반대로, 만약 내가 만든 웹 사이트에서 HTTPS를 도입하고 싶다면, CA 기관의 보안 요건을 충족시켜야 한다.

😄 HTTPS 통신 프로세스

Client와 Server간 통신시 HTTPS의 경우 암호화된 데이터를 전송하게 된다.
때문에 복호화를 위한 키를 주고 받아야 하는데, 이를 위해 조금 더 복잡한 hanshack 과정을 거치게 된다.

Hanshack

컴퓨터간(Client, Server간) 통신을 위해서는 상대 컴퓨터가 데이터를 받을 수 있는 환경인지 확인하는 절차가 필요하다.

Handshack란 이러한 확인 절차로서 TCP handshack의 경우 Target 컴퓨터에 "SYN" 메세지를 보내고 "SYN ACK" 신호를 받고, 마지막으로 "ACK" 신호를 보냄으로서 서로 데이터를 주고받을 수 있는 환경임을 검증한다.

  • 작은 문자열을 주고받아 실제 컴퓨터간 통신이 가능한지를 확인함.

HTTPS 통신의 경우 TLS Handshack란 조금 더 복잡한 과정을 거치게 되는데, 이 과정에서 데이터 암복호화에 사용되는 키를 공유하게 된다.

키 교환 프로세스

위 그림은 Client와 Server간의 TLS Handshack도중 키교환 프로세스만을 도식화 한 그림이다.
HTTPS 통신에서는 해당 과정을 통해 Client와 Server간에 동일한 대칭키를 공유하고 해당 키를 사용하여 암호화 통신을 한다.

1) 인증서 발급 과정

  1. Server -> CA기관
    - 업체 검증 문서와 공개키를 전달한다.
  2. CA기관 -> Server
    - CA 기관에서는 CA 기관에서 사용하는 개인키를 사용하여 서버 공개키가 들어있는 SSL 인증서를 생성해 전달한다.
  3. CA기관 -> Client
    - CA 공개키는 일반적으로 브라우저 설치시 함께 설치된다. 만약 가지고 있지 않다면 인터넷을 통해 다운로드 받게되어있다.

2) Client Server간 키 교환 프로세스

  • TCP Handshack가 끝난 후 TLS Handshack 과정에서 키교환이 이루어진다.
  1. Server -> Client
    - Server 공개키가 들어있는 SSL 인증서를 전달한다.
  2. Client
    - 브라우저에 설치되어있는 CA공개키를 사용해 SSL 인증서를 복호화하여 Server 공개키를 획득한다.
  3. Client -> Server
    - 대칭키를 생성하고 Server 공개키를 사용해 대칭키를 암호화 하여 Server측으로 전달한다.
  4. 양방향
    - 대칭키를 사용하여 암호화된 데이터를 전달한다. (requset, response)

참고.
블로그 nuritech
유튜브 얄팍한 코딩사전

profile
좋은 사람, 좋은 개발자 (되는중.. :D)
post-custom-banner

0개의 댓글