HTTPS의 원리를 공부해보자

Alex·2025년 1월 10일
0

CS를 공부하자

목록 보기
9/74

HTTPS란?

  • HTTP는 인터넷에서 데이터를 주고받는 통신 프로토콜이다. 여기에 보안 기능을 강화한 것 프로토콜이 HTTPS이다.

image

  • HTTP는 원래 보안을 염두에 두지 않고 설계된 프로토콜이라, 모든 요청이 평문(일반 문자열)이다. 그래서 보안에 매우 취약하다. 특히 스니핑과 같은 해킹으로 HTTP 전문을 볼 수 있어서 비밀번호, 개인정보와 같은 중요 데이터를 보호하지 못한다.

  • HTTPS는 기존 HTTP 요청과 응답을 공개키 암호화 방식을 사용해서 암호화한 프로토콜이다. 패킷이 암호화되기 때문에 스니핑을 한다고 해도 어떤 내용인지 알 수 없어서 개인 정보가 노출되지 않는다.

HTTP 동작 원리

일반적으로 URL에 'https://~'를 붙이는 건 데이터를 보내는 통신규약을 HTTPS로 사용하겠다는 것이다.

공개키 암호화방식

공개키와 비밀키 두가지 키를 생성해서 공개키는 클라이언트에 알려주고, 서버에 비밀키를 놔둔다. 클라이언트에서 HTTPS 요청을 보낼 때 공개키로 암호화하고, 서버는 비밀키를 이용해서 다시 원문으로 돌리는 복호화를 한다. 그래서 해커가 공개키를 획득한다고 해도 비밀키가 없으면 메시지를 복호화할 수 없다.

이 방식은 암호화와 복호화에 쓰이는 키가 서로 다르기 대문에 비대칭 방식이다.

개인정보를 수집하고 외부로 공개하는 사이트는 반드시 인증기관을 통해 인증받은 인증서를 사용하도록 법으로 강제하고 있다. 왜 그럴까?

--> 해커가 웹 사이트를 가장할 수 있기 때문이다. 이것을 피싱사이트라고 한다. 겉모양은 은행 사이트와 똑같이 만든 뒤 사용자의 비밀번호와 같은 개인정보를 입력하라고 요청할 수 있다. 이때 HTTPS 프토토콜을 지원하기 위해서 해커가 만든 공개키를 클라이언트에 보내서 암호화하라고 할 수 있다.

클라이언트에서 이 웹 사이트를 신뢰할 수 있는지 여부를 모른다면 해커가 준 공개키로 패킷을 암호화하게 되고, 해커는 자신이 가진 비밀키로 이것을 복호화해서 알 수 있게 된다.

이를 막기 위해서 별도 외부 공인기관을 통해 신뢰할 수 있는 웹사이트인지 인증한다.

image

웹사이트 공개키는 외부 공인기관의 비밀키로 다시 암호화돼서 공인기관 내에 저장된다. 사용자는 인증서를 받게 되고, 그 인증서에는 웹 사이트 공개키 대신 인증정보와 인증기관의 공개키가 들어있어서 인증키관을 통해 웹 사이트 공개키를 요청하게 된다.
그럼으로써 클라이언트는 안전하게 인증된 웹사이트의 공개키를 받는다. 피싱 사이트라고 하더라도 해커가 제공한 공개키가 아닌 공인 인증기관에 저장된 웹 사이트 본래의 공개키로 암호화되어서 해커가 볼 수 없게 된다.

SSL 핸드셰이크 과정

image

(1) 클라이언트에서 웹 서버에 접속한다.
HTTPS를 사용하는 브라우저가 아래 정보를 보낸다.

  • 브라우저가 사용하는 SSL 혹은 TLS 버전 정보
  • 브라우저가 지원하는 암호화 방식 모음
  • 브라우저가 순간적으로 생성한 임의의 난수
  • 만약 이전에 SSL 핸드셰이크가 완성된 상태라면, 그때 생성된 세션 ID

(2) 웹 서버는 (1)에 응답하면서 SSL 인증서가 올바른지 확인한다.
그리고 아래 정보를 클라이언트에게 전달한다.

  • 브라우저의 암호화 방식 중에서 서버가 지원하고 선택한 암호화방식
  • 서버의 공개키가 담긴 SSL 인증서,. 인증서는 CA의 비밀키로 암호화돼 발급된 상태
  • 서버가 순간적으로 생성한 임의의 난수
  • 클라이언트 인증서 요청(선택사항)

(3) 클라이언트는(브라우저가) 서버의 SSL 인증서가 올바른지 확인한다.
대부분의 브라우저에는 공신력 있는 CA들의 정보와 CA가 만든 공개키가 이미 설치돼 있다. 서버가 보낸 SSL 인증서가
정말 CA가 만든 것인지 확인하기 위해, 내장된 CA 공개키로 암호화된 인증서를 복호화한다. 정상적으로 복호화된다면
CA가 발급한 것이 증명된다. 만약 CA가 만든 것이 아니거나, 등록한 CA가 만든것처럼 꾸몄다면 이 과정에서 발각되며
브라우저가 경고를 보낸다.

(4) 브라우저는 자신이 생성한 난수와 서버의 난수를 사용해서 premaster secret을 만든다.
웹 서버 인증서에 딸려온 웹 사이트의 공개키로 이것을 암호화해서 서버로 전송한다.

(5) 서버는 사이트의 비밀키로 브라우저가 보낸 premaster secret을 복호화한다.
복호화한 값을 master secret으로 저장한다. 이것을 사용해 방금 브라우저와 만들어진 연결에 고유한 값을 부여하기 위한
세션 키를 생성한다. 세션키는 대칭키 암호화에 사용할 키다. 이것으로 브라우저와 서버 사이에 주고받는 데이터를 암호화하고 복호화한다.

(6) 서버/클라이언트 SSL 핸드셰이클 종료하고 HTTPS 통신을 시작한다.

웹 상에서 데이터를 세션키를 이용해 암호화/복호화를 하고, HTTPS 프로토콜을 통해 주고받는다. 세션이 여전히 유지되고 있다면 브라우저는 SSL 핸드셰이크 요청이 아닌 세션 ID만 서버에 알려주면 된다.
모든 웹 콘텐츠의 전달을 공개키 방식으로 하면 웹 서버와 브라우저에 많은 부담이 된다. 그래서 그 이후로는 HTTPS 통신이 대칭키 방식으로 변경된다.

image

이때 브라우저와 서버는 각각 premaster secret, 서버에서 생성한 난수, 클랑이언트에서 생성한 난수들을 조합해서 master secret을 생성한다. 이로부터 실제 암호화에 사용할 세션키를 생성하고, 이 세션키가 대칭키가 된다.

[참고]

(1) TLS는 SSL의 개선 버전으로, 최신 인증서는 대부분 TLS를 사용하지만 편의적으로 SSL 인증서라고 말한다.

(2) 대칭키 암호화 방식은 하나의 암호화키로 평문을 암호화하고, 다시 암호문을 원래 평문으로 복호화하는 방식이다. 대칭키는 암호화키를 하나만 사용한다는 편리함이 있지만, 키를 분실하면 누군가 암호문을 복호화할 수있다는 치명적인 단점이 있음.

출처

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글