HTTPS란?

Jae·2024년 6월 29일
post-thumbnail

최근에 본 면접에서 HTTPS에 대해 물어봤고 HTTP와 HTTPS의 차이와 원리, 적용까지 정리해보았습니다.

HTTP란

우리는 원하는 요청이 있을 때 웹 브라우저를 통해 서버에게 요청을 보냅니다. 요청과 응답에는 약속한 규칙이 있습니다. 이를 프로토콜이라고 하며 인터넷상에서는 HTTP 프로토콜 방식이 널리 사용되고 있습니다.

HTTP 요청과 응답

요청

요청은 아래와 같습니다.

GET /main HTTP/1.1 // 1. 
// 2. 
Host: google.com
User-Agent: Mozilla/5.0
Accept-Language: ko-KR
  1. 요청 URL 정보가 첫 줄에 나와있습니다. GET /main HTTP/1.1 에서 HTTP 요청 메소드, URL 경로, HTTP프로토콜 정보를 알 수 있습니다.
  2. HTTP 요청의 헤더로 웹사이트 도메인 호스트, 언어, 사용자의 브라우저등 서버에 필요한 정보를 알 수 있습니다.

응답

요청에 대해 정상적으로 아래와 같은 응답을 받게됩니다.

HTTP/1.1 200 OK 
Date: Sat, 09 Oct 2023 14:28:02 GMT
Server: Apache
Content-Type: text/html

<html>
...
</html>

첫 줄은 요청과 마찬가지로 URL 정보가 나와있습니다.
두 번째 줄부터는 요청에 대한 응답메시지가 담겨있습니다. 위의 예시의 경우 응답시에 HTML 형태의 데이터를 돌려주고있는데, JSON 방식 등 다양한 형태로 응답할 수 있습니다.

HTTPS

HTTP 통신은 암호화없이 데이터로 통신하기 때문에 보안에 취약합니다. 이를 위해 연결을 SSL이나 TLS 프로토콜을 이용하여 암호화하여 사용합니다. 이를 HTTPS라고 합니다.

TLS

SSL 프로토콜은 보안상의 취약점이 있어서 요즘 대부분의 HTTP 암호화는 TLS 프로토콜을 이용합니다.

인증을 통해 신뢰 확보

CA(Certification Authority)에서 받는 인증서로부터 상대 서버의 서비스 정보, 공개키, 지문, 디지털 서명 등의 정보를 통해서 통신하고 있는 서버가 신뢰할 수 있는지를 알려줍니다.

대칭-비대칭 암호화 방식

대칭-비대칭 암호화 조합으로 데이터를 보호합니다. 비대칭키로 대칭키를 공유하고 실제 통신할 때는 대칭키를 이용해서 암호화 및 복호화를 합니다.

무결성

통신 과정에서 데이터의 무결성을 확인합니다.

port

https가 적용되면 443번 포트로 접속해야합니다.

HTTPS가 통신 방식을 이해하기 위해서는 용어 이해가 필요합니다.

여기서 키는 암호화를 위해 값이 변조되는데 그 방식들에 대해 정리하겠습니다.

대칭키와 비대칭키

대칭키

암호화와 복호화 방식이 동일한 것을 의미합니다.

비대칭키

암호화와 복호화 방식이 다른 것을 의미합니다.

공개키와 개인키

암호화와 복호화에 사용되는 암호화 방식이 다를 경우, 암호화를 위한 키의 종류는 공개키와 개인키가 있습니다.

공개키

서버가 인증서를 통해 클라이언트(브라우저)에 제공하는 키로써 데이터를 암호화하는데 사용됩니다. 공개키라는 이름처럼 접근 대상에 대해 열려있다.

개인키

암호화된 데이터를 복호화하는데 사용하는 키로써 서버에 저장되는 암호키입니다.

인증서 발급 과정

서버에서 HTTPS 프로토콜 사용을 위해 CA(인증 기관)에서 SSL 인증서를 받아야합니다.
1. 서버는 공개키와 개인키 쌍을 만듭니다.
2. 서버는 인증서 발급을 위해 인증서 서명 요청(CSR)을 생성해야하는데 그 안에는 서버의 공개키와 정보가 있습니다.
3. 이 정보를 Let's Encrypt와 같은 신뢰할 수 있는 여러 인증기관에 웹사이트를 통해 제출합니다.
4. 인증 기관은 공개키와 비밀키를 생성하고 비밀키를 이용해서 암호화한 인증서를 발급합니다.

인증서 설치

  • nginx나 tomcat의 설정에 설치하면 됩니다.
  • 내장 톰캣의 경우 application.properties나 application.yml에서 설정을 통해 설치하면 됩니다.
  • 인증서 설치가 완료된 서버는 브라우저에서 https로 접속했을 경우 인증서 확인이 가능합니다.

HTTPS 통신 과정

공개키 암호화 방식을 사용해서 안전한 통신을 확인하고 세션키를 통해 데이터를 암호화하여 통신합니다.

1. TCP/ IP Handshake

클라이언트가 서버와 통신하기 위해 통신이 가능한지 확인하는 과정입니다.

2. TLS Handshake

안전한 통신을 하기 위해 검증하는 과정입니다.
1. Client Hello : 클라이언트가 서버와의 연결을 위해 아래의 정보를 가진 패킷을 서버에 요청합니다.
패킷에 포함된 정보 : 선택 가능한 프로토콜 버전, 암호화 알고리즘 종류 등
2. Server Hello: Client Hello에 응답하는 패킷으로 서버가 선택한 프로토콜 버전, 암호화 알고리즘 정보가 있습니다.
3. Certificate : 서버가 클라이언트에게 인증 정보를 담아서 응답합니다.
Certificate에는 signature algorithm, public key info(공개키) 등이 포함되어 있습니다.

3. 인증서 검증 및 세션 키 생성

  1. 클라이언트는 Certificate 안에 있는 인증서를 검증합니다.
  2. SSL 인증서는 인증기관(CA)의 비밀키를 이용해서 인증서를 암호화하였습니다. 따라서 CA의 공개키를 이용해서 복호화가 가능합니다.
  3. 인증이 완료되면 클라이언트는 서버의 공개 키를 사용하여 세션 키를 암호화하고 서버에 전달합니다.
  4. 서버는 갖고있는 비밀키를 이용하여 세션키를 복호화합니다.

참고

https://www.cloudflare.com/ko-kr/learning/ssl/how-does-public-key-encryption-work/
https://docs.tosspayments.com/resources/glossary/http-protocol

전달사항

velog가 자꾸 저장이 되다가 안되다가 데이터가 맞다가 안 맞다가 해서 정리 아래 링크에 백업용도로 만들었습니다. 내용이 이상하면 아래 링크를 확인해주시거나 댓글로 알려주시면 velog 내용 수정하겠습니다.
https://github.com/jaeeunjeong/Today-I-Learned/tree/master/Network

0개의 댓글