우노
[Network] HTTP, HTTPS 및 SSL/TLS 암호화 프로토콜 본문
HTTP(Hyper Text Transfer Protocol)란?
HyperText 문서(ex. html)를 주고받는 프로토콜입니다.
- ex) 클라이언트가 웹 브라우저에 URL을 입력하면, 웹 서버에 HyperText 문서를 요청하고 응답받는 과정이 진행됩니다.
HTTP 요청(Request) 예제
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- GET : HTTP 메서드로 서버 리소스를 요청합니다.
- /index.html : 요청하는 리소스의 경로입니다.
- Host : 요청을 보내는 대상 서버의 도메인 이름입니다.
- User-Agent : 요청을 보내는 클라이언트(브라우저)의 정보입니다.
- Accept : 클라이언트가 받을 수 있는 콘텐츠 타입을 나열합니다.
HTTP 응답(Response) 예제
HTTP/1.1 200 OK Date: Fri, 22 May 2015 06:07:21 GMT Content-Type: text/html Content-Length: 1256 <!doctype html> <html> <head> <title>Example Domain</title> ... (응답 본문 생략) </html>
- HTTP/1.1 200 OK : HTTP 버전과 상태 코드(200은 성공)입니다.
- Date : 응답이 생성된 날짜와 시간입니다.
- Content-Type : 응답 본문의 콘텐츠 타입(여기서는 HTML)입니다.
- Content-Length : 응답 본문의 길이(바이트 단위)입니다.
- (응답 본문) : 서버가 클라이언트에게 보내는 실제 콘텐츠입니다(예시에서는 HTML 코드).
HTTPS(Hyper Text Transfer Protocol Secure)란?
- HTTPS는 SSL/TLS 암호화 프로토콜을 사용하여 클라이언트와 서버 간 통신 내용을 암호화하는 프로토콜입니다.
- 일반 HTTP 통신에서는 평문 데이터를 그대로 전송하므로, 통신 내용이 제3자에게 노출될 수 있는 위험이 있습니다.
- HTTPS에서 암호화되는 부분은 다음과 같습니다.
- 요청 본문 (Request Body)
- POST 또는 PUT 요청과 같이 요청 본문에 데이터가 포함된 경우, 해당 데이터는 암호화됩니다.
- 예를 들어, 로그인 폼의 사용자 이름과 비밀번호와 같은 민감한 정보가 요청 본문에 포함될 수 있습니다.
- 응답 본문 (Response Body)
- 서버에서 클라이언트로 전송되는 응답의 내용은 암호화됩니다.
- 응답 본문에는 HTML, JSON, 이미지 등의 데이터가 포함될 수 있습니다.
- 요청 본문 (Request Body)
- 나머지 정보들은 요청, 응답을 올바르게 처리하고 라우팅하는데 필요한 정보이기 때문에 암호화되지 않습니다.
SSL(Secure Sockets Layer) / TLS(Transport Layer Security) 암호화 프로토콜이란?
- 위에서 언급했듯이, SSL/TLS 암호화 프로토콜은 HTTPS에서 클라이언트와 서버 간 통신 내용을 암호화할 때 사용되는 프로토콜입니다.
- TLS는 SSL의 후속 버전이며, 현재는 TLS가 널리 사용되고 있습니다.
- SSL/TLS 암호화 프로토콜은 다음 순서로 진행됩니다.
- 암호화 통신 세션 연결 (SSL / TLS 핸드셰이크)
- 암호화 통신
- 암호화 통신 세션 연결 해제
암호화 통신 세션 연결 (SSL / TLS 핸드셰이크) 방법
- 클라이언트에서 서버의 SSL/TLS 인증서를 확인해 신뢰 가능한 서버인지 검증하고 클라이언트와 서버간의 안전한 데이터 전송을 위해 대칭키를 공유합니다.
- 클라이언트
- HTTPS 통신을 시작하겠다는 요청(Client Hello)을 보냅니다.
- 클라이언트가 지원하는 SSL/TLS 버전, 암호화 알고리즘, 압축 방식 등의 정보를 포함합니다.
- HTTPS 통신을 시작하겠다는 요청(Client Hello)을 보냅니다.
- 서버
- 응답(Server Hello)을 보냅니다.
- 클라이언트의 SSL/TLS 버전, 암호화 알고리즘 등을 선택합니다.
- 서버의 SSL/TLS 인증서를 보냅니다.
- SSL/TLS 인증서에는 서버 공개키, 서버 도메인, 인증기관 정보, 유효기간 등이 포함되어 있으며,
- 인증기관(CA, Certificate Agent)의 개인키로 암호화(서명)되어 있습니다.
- 응답(Server Hello)을 보냅니다.
- 클라이언트
- 서버의 SSL/TLS 인증서 검증
- 클라이언트는 신뢰할 수 있는 CA(인증기관)의 공개키를 사용해, 서버 인증서의 서명을 검증하고,
- 인증서에 포함된 정보(서버 도메인, 유효기간 등)를 확인합니다.
- 대칭키 전송
- 인증서 검증에 성공하면 클라이언트는 데이터 암호화에 사용될 대칭키를 생성하고,
- 서버의 공개키로, 대칭키를 암호화하여 전송합니다.
- 서버의 SSL/TLS 인증서 검증
- 서버
- 서버의 개인키로, 암호화된 대칭키를 복호화합니다.
- 클라이언트
전체적인 HTTPS 통신 순서
- TCP 연결 설정 (3-way Handshake)
- 클라이언트가 서버에게 SYN 패킷을 보냅니다.
- 서버는 SYN 패킷을 받고, 클라이언트에게 SYN+ACK 패킷을 보냅니다.
- 클라이언트는 SYN+ACK 패킷을 받고, 서버에게 ACK 패킷을 보냅니다.
- 암호화 통신 세션 연결 (SSL/TLS 핸드셰이크)
- 클라이언트와 서버는 SSL/TLS 버전 및 암호화 알고리즘을 협상합니다.
- 서버는 SSL/TLS 인증서를 클라이언트에게 전송합니다.
- 클라이언트는 서버의 인증서를 검증하고, 안전한 데이터 전송을 위한 대칭키를 생성하여 서버의 공개키로 암호화한 후 전송합니다.
- 서버는 개인키로 대칭키를 복호화합니다.
- 암호화 통신
- 클라이언트와 서버는 공유된 대칭키를 사용하여 데이터를 암호화하고 복호화하며 통신합니다.
- 암호화 통신 세션 연결 해제
- 클라이언트 또는 서버가 SSL/TLS 세션 종료를 알리는 "close_notify" 경고 메시지를 보냅니다.
- 상대방은 "close_notify" 경고 메시지로 응답하여 SSL/TLS 세션 종료를 확인합니다.
- 클라이언트와 서버는 공유된 대칭키를 폐기합니다.
- TCP 연결 해제 (4-way handshake)
- 클라이언트 또는 서버가 상대방에게 FIN 패킷을 보냅니다.
- 상대방은 FIN 패킷을 받고, ACK 패킷을 보냅니다.
- 상대방도 FIN 패킷을 보냅니다.
- 클라이언트 또는 서버가 FIN 패킷을 받고, ACK 패킷을 보냅니다.
참고
'Network & Security > Concept' 카테고리의 다른 글
[Network] 로드밸런싱 알고리즘 종류 (0) | 2023.05.21 |
---|---|
[Network] CIDR 계산 방법 (1) | 2023.03.25 |
[Network] 통신사별 DNS 서버 아이피 주소 (SKT, KT, LG, 구글) (0) | 2023.02.23 |
[Network] OpenID Connect(OIDC), OAuth 2.0 차이 (0) | 2023.02.18 |
[Network] HTTP 상태 코드 (0) | 2023.02.18 |
Comments