-
[Spring Boot] HTTP/HTTPS (1/2) : 개념 이해서버개발/spring-boot 2020. 1. 21. 20:15
HTTP와 HTTPS
HTTP (Hypertext Transfer Protocol)는 Hypertext (대표적으로 HTML. Hypertext Markup Language)를 전송하기 위한 통신규약이다. HTTPS에서 S는 Secure Socket Layer의 약자이며, 이름 그대로 보안을 위한 통신 레이어가 추가된 HTTP 이다.
HTTP와 TCP/IP
HTTPS를 살펴보기 전에 기본적인 HTTP의 통신 흐름에 대해 확인한다.
TCP/IP
인터넷을 포함한 일반적인 네트워크는 대부분 TCP/IP 프로토콜로 통신을 한다. HTTP는 이러한 TCP/IP 프로토콜의 응용 계층(Application Layer)의 프로토콜이며, 일반적으로 HTTP 프로토콜이 사용된 통신방법을 의미한다. TCP/IP는 응용 계층, 전송 계층(Transport Layer), 네트워크 계층(Network Layer, Internet Layer), 링크 계층(Link Layer, Network Interface Layer) 총 4 계층으로 이루어져 있다.
- 응용 계층은 유저에게 제공되는 애플리케이션에서 사용하는 통신방법을 정의하며, 이를 전송 계층으로 전달한다.
- 전송 계층은 데이터를 패킷단위로 나누고, 헤더에 포트번호를 추가하고 네트워크 계층으로 전달한다.
- 네트워크 계층은 패킷을 전송할 경로를 선택하고 IP 헤더를 추가해 링크 계층으로 전달한다.
- 링크 계층은 수신지의 MAC 주소를 헤더에 추가하고 패킷을 전송한다.
TCP/IP의 통신 흐름
- HTTP에서 페이지 클릭
- TCP에서 메시지를 조각내고 포트번호를 붙여서 네트워크 계층에 전달
- IP에서 수신지 MAC 주소를 추가해서 링크 계층에 전달
- 링크 계층에서 전송
HTTP와 관련된 프로토콜
- 응용 계층 : DNS(Domain Name Server)
- 도메인 이름과 IP 주소 이름을 확인한다.
- 전송 계층 : TCP(Transfer Control Protocol)
- 데이터를 세그먼트(패킷) 단위로 나누고, 이것이 정확하게 도착했는지 확인한다. -> 쓰리웨이 핸드쉐이킹(3-way handshaking)
- 네트워크 계층 : IP(Internet Protocol)
- ARP(Address Resolution Protocol) 프로토콜을 통해 IP주소를 바탕으로 MAC 주소를 확인할 수 있다.
HTTPS 통신 방법 : SSL 이란
HTTPS와 SSL/TLS
SSL(Secure Socket Layer)은 넷스케이프사가 개발한 표준 암호화 프로토콜의 명칭이며, 이것이 확산되다 IETF 표준화 기구에서 관리하기 시작해서 변경된 명칭이 TLS(Transport Layer Security)이다. TLS 1.0은 SSL 3.0을 기반으로 한다. 이름 그대로 SSL/TLS 는 통신 계층에서 전송 계층에 대한 암호화를 말한다.
HTTPS 프로토콜은 HTTP에서 SSL/TLS 프로토콜 계층을 보유하고 있는 것을 말한다.
SSL 인증서
SSL 인증서는 클라이언트와 서버 간의 통신을 제삼자가 보증해주는 전자화된 문서이다. 클라이언트가 접속한 직후에 서버는 클라이언트에게 이 인증서를 제공한다. 이후, 브라우저는 인증서 정보를 검증한다. 브라우저별로 내장된 인증기관 목록을 가지고 있으며 이를 통해 인증서가 유효한지를 검증할 수 있다. 인증서에는 다음과 같은 내용이 포함되어 있다.
- 서비스의 정보 : 인증서를 발급한 CA, 서비스 도메인 등
- 서버 측 공개키 : 공개키, 공개키의 암호화 방법
인증서의 용도
- 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장한다.
- SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.
인증 기관(CA. Certificate authority)
클라이언트가 접속한 서버가 신뢰 가능한 서버인지를 보장하는 민간기업들은 CA 또는 Root Certificate라고 부른다. Symantec, Comodo, GoDaddy, GlobalSign 등이 있으며, 국내에는 한국 정보인증(주), 한국 전자인증(주), (주)코스콤, 금융결제원, (주)한국 무역정보통신 이 있다.
SSL 통신 과정
SSL 통신을 요약하면 다음의 3단계로 이루어져 있다. 이 페이지에서는 아래 3단계 중 가장 중요한 Handshaking 단계에 대해 중점적으로 알아본다.
- Handshaking 단계
- 인증서 전달/수신
- 메시지 암호화에 사용할 대칭키 전달
- Handshaking 단계에 대한 무결성 검증
- 세션 단계
- 실제로 서버와 클라이언트 간 데이터를 주고받는 단계
- 세션 종료 단계
- 통신이 종료되고 대칭키를 폐기 단계
SSL 통신에 사용되는 암호화 방식
SSL 통신은 다음 두 가지 암호화 방식을 모두 사용한다.
- 공개키 암호화 : 대칭키를 전달하는 데 사용된다.
- 대칭키 암호화 : 데이터를 암/복호화하는 데 사용된다.
공개키 암호화는 대칭키 암호화에 비해 상대적으로 많은 부하가 발생하기 때문에 대칭키를 안전하게 공유하는 용도로만 사용된다.
* 링크 참조 : https://lucy7599.tistory.com/367
SSL 인증서 확인
아래 Handshaking 단계에는 인증서 확인이 포함되어 있다. 인증서 확인을 통해 서비스를 보증할 수 있으며, 다음과 같은 프로세스로 진행된다.
- 브라우저를 통해 서버에 접속
- 서버는 인증서를 브라우저에게 제공
- 브라우저가 내장 CA 리스트에 인증서의 CA가 포함된 지 확인
- CA의 공개키로 인증서를 복호화
Handshaking 단계
앞서 살펴본 쓰리웨이 핸드쉐이킹(3-way handshaking) 단계는 TCP 통신을 성립하는 단계이다. 이후, 클라이언트와 서버는 다시 SSL핸드쉐이킹 단계를 통해 SSL 통신을 준비하게 된다. 이때 SSL 인증서를 주고받으며, 키를 공유하게 되어 SSL 통신 준비를 마치게 된다. 다음과 같은 프로세스로 진행된다.
- 클라이언트가 서버에 접속하는 단계 : Client Hello
- 서버로 전달
- 클라이언트 측에서 생성한 랜덤 데이터 전달(Client Nounce)
- 클라이언트가 지원하는 암호화 방식 전달
- 세션 아이디 전달
- 이미 SSL 핸드쉐이킹을 한 경우에는 비용과 시간을 아끼기 위해 기존 세션을 재 활용한다
- 서버로 전달
- 서버가 응답하는 단계 : Server Hello
- 클라이언트로 전달
- 서버 측에서 생성한 랜덤 데이터 전달(Server Nounce)
- 서버가 선택한 클라이언트의 암호화 방식 전달
- 인증서
- 클라이언트로 전달
- 클라이언트가 서버에게 키를 공유하는 단계 : Client Key Exchange
- 인증서를 검증한다
- 서버의 공개키를 획득하게 된다.
- 자신의 랜덤 데이터와 서버의 랜덤 데이터를 조합해서 pre-master-secret(PMS)를 생성한다.
- 이 값은 대칭키를 생성하는 중요한 값이기 때문에 절대로 노출되면 안 된다.
- 클라이언트는 생성한 PMS를 서버로 전송한다.
- 서버가 전송한 인증서 내 공개키를 이용해 암호화한다.
- 서버는 클라이언트를 통해 전달받은 PMS를 자신의 비밀키로 복호화한다.
- 이로 인해 서버와 클라이언트 모두 대칭키를 생성하는 데 사용되는 PMS를 공유하게 된다.
- 이후 클라이언트와 서버 각각 PMS, Client Nounce, Server Nounce를 통해 master-secret을 생성하고, master-secret을 통해 session-key를 생성한다.
- 이 session-key 가 서버와 클라이언트 간 통신 암호화에 사용되는 대칭키이다.
- 인증서를 검증한다
- 클라이언트와 서버는 핸드 셰이크 단계의 종료를 서로에게 알리는 단계 : Handshake Integrity Check
- SSL이 이루어지기 전의 핸드쉐이킹 단계에서 전송되고 수신된 메시지들에 대한 MAC(Message Authentication Code) 값을 계산해서 검증한다.
- MAC key 도 역시 PMS, Client Nounce, Server Nounce를 이용해서 생성되며, 이전 암호화 통신 이전 내용들에 대한 무결성을 검증하는 데 사용된다.
- SSL이 이루어지기 전의 핸드쉐이킹 단계에서 전송되고 수신된 메시지들에 대한 MAC(Message Authentication Code) 값을 계산해서 검증한다.
세션 단계
이전 단계에서 생성된 세션 키 를 이용해서 암호화 통신을 하는 단계이다.
세션 종료 단계
통신이 완료되면 통신 종료를 서로에게 알리고 세션 키를 폐기하는 단계이다.
TLS 확장 기능 : 세션 티켓(Session Ticket)
링크 참조 : http://withbundo.blogspot.com/2018/01/https-ssl-session-id-session-ticket.html
참고 자료
- 생활 코딩 HTTPS : https://opentutorials.org/course/228/4894
- SSL/TLS 적용 : https://soul0.tistory.com/510
- HTTPS에 대한 기초 이해 : https://cheese10 yun.github.io/https/
- HTTPS와 SSL, SSL 인증서 동작 방법 : https://wayhome25.github.io/cs/2018/03/11/ssl-https/
- SSL Handshake 과정 : https://www.tuwlab.com/ece/26967
- 그림으로 배우는 HTTP Network Basic : http://www.yes24.com/24/viewer/preview/15894097
- OSI 7 계층 vs TCP/IP 4 계층 : https://goitgo.tistory.com/25
- 공개키 암호화 성능 분석 : https://lucy7599.tistory.com/367
'서버개발 > spring-boot' 카테고리의 다른 글
[Spring Boot] JPA (2/4) : JPA 기본 개념 (0) 2020.01.30 [Spring Boot] JPA (1/4) : SQL/NoSQL 차이점 (0) 2020.01.29 [Spring Boot] OAuth2 (1/2) : 개념 이해 (0) 2020.01.21