HTTP와 HTTPS의 차이점
- HTTP: HTTP는 데이터를 암호화하지 않습니다. 즉, 클라이언트(브라우저)와 서버 간에 주고받는 데이터가 평문(Plain Text) 상태로 전송됩니다. 따라서 네트워크 상에서 중간에 누군가가 데이터를 가로챌 경우, 내용을 쉽게 읽을 수 있습니다.
- HTTPS: HTTPS는 데이터를 암호화합니다. HTTPS는 SSL/TLS(보안 소켓 계층 또는 전송 계층 보안) 프로토콜을 사용하여 브라우저와 서버 간의 데이터를 암호화한 후 전송합니다. 이를 통해 중간에서 누군가가 데이터를 가로채더라도 내용을 읽을 수 없도록 보호됩니다. 이를 종단 간 암호화라고 합니다.
그렇다면 HTTPS를 사용하는 목적은?
API 요청이 안전하게 전송되도록 보장하기 위해서 사용되고, 서버는 따로 요청을 보낸 사용자가 인증된 사용자임을 JWT같은 인증 과정을 통해 확인해야 합니다.
종단 간 암호화란?
종단간 암호화는 메시지를 처음부터 끝까지 평문으로 저장하지 않고 암호화하는 안전한 통신 방법입니다. 클라이언트에서 메시지를 전송하는 단계부터 최종적으로 수신자에 전달되는 단계까지 메시지를 암호화하기 때문에 'End to End Encryption(E2EE)'으로 불리기도 합니다. 종단간 암호화 방법은 메시지를 복호화할 수 있는 키를 서버에 저장하지 않고, 수신자 장치에서 저장합니다.
SSL/TLS란?
HTTPS는 SSL(보안 소켓 계층) 또는 TLS(전송 계층 보안) 프로토콜을 사용하여 데이터를 암호화합니다. 보안 소켓 계층(SSL)은 네트워크상의 두 디바이스 또는 애플리케이션 간에 보안 연결을 생성하는 통신 프로토콜 또는 규칙 세트입니다. 여기서 SSL은 이전 버전이며, 현재는 TLS가 더 일반적으로 사용되고 있습니다. TLS는 데이터 전송을 암호화하여 통신 중에 제3자가 데이터를 읽거나 변조하지 못하도록 합니다. 이를 통해 SSL/TLS는 다음과 같은 역할과 보호 방식을 구현합니다
SSL/TLS의 주요 역할
- 서버 인증: SSL/TLS는 서버의 신원을 확인합니다. 클라이언트(브라우저)는 서버가 제공한 SSL/TLS 인증서를 확인하여 서버가 신뢰할 수 있는지 검증합니다.
- 핸드셰이크: SSL/TLS 핸드셰이크는 클라이언트와 서버가 안전한 통신을 할 수 있도록, 세션 키를 협상하는 과정을 담당합니다. 이 과정에서 서버 인증이 이루어지며, 클라이언트와 서버 간에 안전한 연결을 설정합니다.
- 데이터 암호화: 핸드셰이크 과정에서 협상된 세션 키를 사용해 클라이언트와 서버 간의 데이터를 암호화하여, 제3자가 데이터를 읽거나 도청하지 못하게 보호합니다. 이 세션 키는 대칭 암호화를 위한 키로, 동일한 키로 데이터를 암호화하고 복호화합니다. 비대칭 암호화는 연산이 복잡하므로, 핸드셰이크 후 대칭 암호화를 사용하여 빠르고 안전하게 데이터를 주고받습니다.
- 데이터 무결성 보장: SSL/TLS는 전송 중 데이터가 변조되지 않도록 해시 함수를 사용하여 데이터의 무결성을 보장합니다. 이를 통해 클라이언트와 서버는 서로 주고받는 데이터가 중간에서 수정되지 않았음을 확인할 수 있습니다.
HTTPS 설정 과정
- 인증서 발급: HTTPS를 사용하려면 SSL/TLS 인증서를 발급받아야 합니다. 인증서에는 서버의 도메인 이름과 공개 키 정보가 포함됩니다. 이를 위해 CSR(Certificate Signing Request) 파일을 생성한 후, 인증 기관(CA)에 인증서를 요청합니다.
- 인증 기관(CA)에 신청: CSR을 제출하면, CA는 서버의 소유 여부를 확인한 후 인증서를 발급합니다. 인증서는 서버의 신원을 확인하고, 데이터를 암호화하는 데 필요한 정보를 제공합니다.
- 인증서 설치: 발급받은 인증서를 웹 서버에 설치합니다. 이 인증서를 통해 브라우저는 서버가 신뢰할 수 있는지 확인하고, 암호화된 연결을 설정합니다.
- HTTPS 설정: 웹 서버(Nginx, Apache 등)에서 HTTPS를 설정한 후, HTTP 요청을 HTTPS로 리디렉션하는 방법을 설정합니다. 이를 통해 사용자는 보안된 HTTPS 프로토콜로만 웹사이트에 접속할 수 있습니다.
HTTPS 요청 및 응답 흐름의 단계
HTTPS 프로토콜의 요청 및 응답 흐름은 HTTP와 같은 방식으로 시작됩니다. 단, 중간 단계인 1.5단계를 사용해 두 흐름을 구분합니다.
1단계: 탐색 및 시작
사용자가 브라우저에 웹 주소를 입력하거나 이메일 또는 기타 통신에 포함된 링크를 클릭합니다. 주소에는 URL(Uniform Resource Locator)이 포함되어 있습니다. URL을 나타내는 문서를 가져올 때 HTTP를 사용함을 브라우저에 알리기 위해 URL에 HTTP가 포함됩니다.
1.5단계: 암호화 동작
단계 1.5에서는 브라우저와 웹 서버가 '암호화 동작'을 수행합니다. 여기에 암호화된 메시지의 교환이 포함됩니다. 이 단계를 수행하려면 CA(인증 기관)를 통해 생성된 웹 서버의 공개 및 비공개 키 쌍을 사용해 TLS 프로토콜에서 복잡한 암호화 기능을 수행해야 합니다. 이 단계에서는 웹사이트를 인증하고 클라이언트용 키와 서버용 키 두 개(세션 키)를 새로 만듭니다. 이러한 세션 키는 메시지를 암호화하고 해독하는 데 사용됩니다.
2단계: 클라이언트가 서버로 HTTP 요청 메시지 전송
2단계는 HTTP 2단계 요청 및 응답 흐름과 동일합니다. 클라이언트(예: 브라우저)는 웹 서버로 리디렉션되는 요청 메시지를 작성합니다. 메시지에는 요청 엔터티와 같은 요청에 대한 추가 정보가 포함됩니다. 그러나 HTTP와 달리 요청 메시지를 작성한 후 브라우저에서 메시지를 보내기 전에 HTTP(S) 요청은 세션 키를 사용해 메시지를 암호화해야 합니다.
3단계: 웹 서버가 HTTPS 응답을 클라이언트로 다시 전송
요청이 수신되면 웹 서버는 세션 키를 사용해 메시지를 해독하고 읽습니다. 그런 다음 웹 서버는 응답 메시지를 작성하고, 세션 키를 사용해 암호화한 후 브라우저로 다시 보냅니다.
4단계: 브라우저에서 메시지 렌더링
암호화된 메시지를 수신하면 브라우저는 세션 키를 사용해 암호를 해독하고 메시지를 읽습니다. 이 단계의 마지막 부분에서는 브라우저에서 응답 메시지를 렌더링하고 브라우저에 웹페이지를 표시합니다.
HTTPS 보안 강화 및 성능 최적화
HSTS(HTTP Strict Transport Security)
HSTS는 웹 브라우저가 웹사이트에 HTTPS로만 접속하도록 강제하는 보안 정책입니다. 이를 통해 사용자가 실수로 HTTP로 접속하는 것을 방지하고, 항상 HTTPS를 통해 안전한 연결을 유지할 수 있습니다. 서버는 HSTS 헤더를 사용하여 클라이언트에게 HTTPS로만 접속할 것을 지시합니다. 이를 통해 중간자 공격(MITM) 등의 위험을 줄이고, 웹사이트의 보안을 지속적으로 유지할 수 있습니다.
세션 키 최적화
세션 키 교환 시 최신 암호화 알고리즘(TLS 1.3 등)을 사용하면 성능을 크게 향상시킬 수 있습니다. TLS 1.3은 빠르고 안전한 연결을 제공하며, 핸드셰이크 과정을 간소화해 성능 최적화를 돕습니다.
HTTP/2 지원
HTTPS와 함께 HTTP/2를 사용하면 성능을 더욱 최적화할 수 있습니다. HTTP/2는 다중 요청을 하나의 연결에서 처리할 수 있어 페이지 로딩 속도를 개선하고, 네트워크 자원의 효율적인 사용을 가능하게 합니다.
OCSP 스테이플링
HTTPS에서는 서버의 인증서를 클라이언트가 확인해야 하는데, OCSP 스테이플링은 이 과정을 최적화하는 기술입니다. 이를 통해 인증서 검증 시간을 단축하고, 웹사이트의 응답 속도를 향상시킬 수 있습니다.
마무리
HTTPS는 현대 웹 보안에서 매우 중요한 역할을 합니다. 특히 API 요청 및 민감한 데이터 전송 시, HTTPS는 데이터를 보호하고 중간에서 탈취되는 것을 방지하는 중요한 수단입니다. SSL/TLS를 통해 서버의 신원을 인증하고, 데이터를 안전하게 암호화하며, 데이터 무결성을 보장하는 것이 HTTPS의 핵심입니다. SSL/TLS 인증서를 발급받고, 웹 서버에 설치하여 HTTPS를 구현하는 과정을 통해 웹 애플리케이션의 보안을 강화할 수 있습니다.
참고 자료
https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/
https://aws.amazon.com/what-is/ssl-certificate/
'Backend Programming' 카테고리의 다른 글
HTTP란? (0) | 2024.10.05 |
---|---|
인터넷의 작동 원리 (0) | 2024.10.04 |
JWT을 사용하여 로그인 서비스 만들기 (2) | 2024.09.22 |
회원가입 서비스 만들기 (2) | 2024.09.20 |
DTO에서 NotNull설정이 되어 있을 때 PATCH를 어떻게 해줘야할까? (1) | 2024.08.26 |