[네트워크] 응용 계층(Application) - HTTP와 HTTPS (SSL/TLS)
HTTP의 기본 개념
- HTTP(HyperText Transfer Protocol)는 웹에서 정보를 교환하는 데 사용되는 애플리케이션 계층 프로토콜이다.
- 이 프로토콜은 웹 브라우저(클라이언트)와 웹 서버 간의 통신을 가능하게 하며, HTML 문서나 이미지와 같은 리소스를 요청하고 전송받는 데 사용된다.
- 하이퍼텍스트(Hypertext): 노드(node)와 링크(link)를 통해 웹 상의 다른 문서나 멀티미디어 등으로 이동할 수 있도록 구조화 되어 있는 텍스트
- 데이터를 암호화하지 않고, 통신 상대방을 확인하지 않기 때문에 보안에 취약하다.
- 상태 비저장성(Statelessness)
- HTTP는 상태를 유지하지 않는 프로토콜이다. 즉, 이전 통신과의 연속성을 유지하지 않는다.
- 서버는 클라이언트의 이전 요청을 기억하지 않고, 각 요청을 독립적인 트랜잭션으로 처리한다.
- 이를 해결하기 위해 쿠키, 세션과 같은 기술을 사용한다.
- 클라이언트-서버 모델
- 클라이언트는 서버에 리소스 요청을 보내고, 서버는 그 요청에 응답한다.
- 클라이언트는 주로 웹 브라우저이며, 서버는 웹 사이트를 호스팅하는 컴퓨터이다.
HTTP의 메소드
HTTP 프로토콜은 다음과 같은 다양한 메소드를 지원한다.
- GET: 서버에서 특정 리소스를 요청한다. 데이터를 검색하는 데 사용되며, 데이터를 수정하지 않는다.
- POST: 서버로 데이터를 전송하여 리소스를 생성한다. 폼 데이터 제출이나 파일 업로드 시 사용된다.
- PUT: 지정된 URI에 리소스를 생성하거나, 이미 존재하는 경우 그 리소스를 대체한다.
- DELETE: 지정된 URI의 리소스를 삭제한다.
- HEAD: GET과 유사하지만, 응답 본문 없이 HTTP 헤더 정보만을 반환한다. 리소스의 메타데이터를 검사하는 데 유용하다.
- OPTIONS: 대상 리소스에 대해 통신 옵션을 설명하는 데 사용된다.
HTTPS (HTTP Secure)
- HTTPS는 SSL 또는 TLS 프로토콜을 사용하여 HTTP 통신을 암호화하는 확장된 프로토콜이다.
- 데이터를 암호화하여 전송하기 때문에, 데이터의 기밀성과 무결성을 보장한다.
- 무결성: 데이터가 정확하고 완전한 상태로 유지되며, 의도치 않은 방식으로 변경되거나 손상되지 않음
- 또한, HTTPS는 서버의 신원을 인증하고, 사용자가 접속하려는 서버가 실제 의도한 서버임을 보증한다.
SSL(Secure Sockets Layer)과 TLS(Transport Layer Security)
- SSL과 TLS는 데이터를 안전하게 전송하기 위해 네트워크 통신에 암호화를 추가하는 프로토콜이다.
- 데이터 암호화, 데이터 무결성 검증, 그리고 서버 인증을 제공한다.
- TLS는 SSL의 개선된 버전으로, 현재 인터넷 보안 통신의 표준으로 널리 사용된다.
SSL → TLS 개선점
암호화 알고리즘 강화
- 더 강력한 암호화 알고리즘 지원: TLS는 더 안전한 암호화 알고리즘과 키 교환 메커니즘을 지원한다. 예를 들어, TLS 1.2는 AES (Advanced Encryption Standard)와 같은 현대적 암호화 기술을 사용한다.
- SHA-256 지원: TLS 1.2부터는 SHA-256과 같은 강력한 해시 함수를 사용하여 데이터의 무결성을 보장한다. 이는 SSL에서 사용되던 MD5와 SHA-1에 비해 훨씬 더 강력하고 안전하다.
보안 취약점 해결
- POODLE과 같은 공격 방지: SSL 3.0은 POODLE(Padding Oracle On Downgraded Legacy Encryption) 공격에 취약했다. TLS는 이러한 취약점을 해결하여 보안을 강화했다.
- 암호화된 알림 메시지: TLS에서는 모든 알림 메시지가 암호화되어 전송되므로, 중간자 공격으로부터 보호받을 수 있다.
프로토콜 유연성
- 확장성: TLS 프로토콜은 확장 가능하도록 설계되어 향후 보안 요구사항 변화에 더 잘 대응할 수 있게 한다. 예를 들어, TLS 1.3은 이전 버전들보다 더 단순화되고 효율적인 핸드셰이크 과정을 제공한다.
- 세션 재개 기능: TLS는 세션 티켓을 사용하여 이전에 협상된 세션을 빠르게 재개할 수 있는 기능을 제공함으로써 연결 설정 시간을 단축시키고 성능을 향상시킨다.
성능 향상
- 핸드셰이크 최적화: TLS 1.3은 핸드셰이크 과정에서 라운드 트립을 줄여 네트워크 지연 시간을 최소화한다.
호환성과 표준화
- 표준화된 프로토콜: TLS는 IETF(Internet Engineering Task Force)에 의해 공식적으로 표준화된 프로토콜로, 넓은 범위의 애플리케이션과 시스템에서 널리 지원되고 호환될 수 있다.
HTTPS 연결에서의 CA와 SSL/TLS의 역할
- 인증서 발급: 웹 서버 운영자는 CA에 인증서 발급을 요청한다. CA는 요청을 검증한 후, 유효한 요청으로 판단되면 디지털 인증서를 발급한다.
- CA(Certificate Authority): 디지털 인증서를 발급하고 관리하는 기관이다. 개인 키와 공개 키가 포함된 인증서를 발급하여, 웹 서버나 다른 엔터티의 신원을 인증한다. 디지털 인증서는 서버의 신원 정보, 공개 키, 발급 기관, 유효 기간 등을 포함한다. 웹 브라우저와 같은 클라이언트는 이 인증서를 받아서 서버의 신원을 검증하고, 이후의 암호화된 통신에 서버의 공개 키를 사용한다.
- HTTPS 연결 설정: 클라이언트(웹 브라우저)가 HTTPS를 통해 웹 서버에 접속할 때, 서버는 자신의 디지털 인증서를 클라이언트에게 제공한다.
- 인증서 검증: 클라이언트는 받은 인증서를 검증하여 서버의 신원을 확인한다. 이 과정은 CA의 신뢰성에 기반하며, 클라이언트 시스템에 사전에 설치된 CA의 루트 인증서를 사용하여 이루어진다.
- 암호화 통신: 인증서가 유효하면, 클라이언트와 서버는 SSL/TLS 프로토콜을 사용하여 암호화된 통신 채널을 설정하고, 이 채널을 통해 데이터가 안전하게 교환된다.
TLS HandShake
- 데이터를 주고 받기 전, 서버의 무결성을 확인하고 대칭키를 전달하는 과정이 TLS Handshake이다.
사용자가 TLS를 사용하는 웹사이트를 접속하면 클라이언트와 웹 서버간에 TLS Handshake가 시작된다.
- TLS 핸드셰이크 과정은 세션을 처음 시작할 때 또는 기존 세션이 만료되었을 때 일어난다.
- 한 번 세션이 설정되고 나면, 그 세션의 유효 기간 동안 추가적인 핸드셰이크 없이 데이터 통신이 계속 이루어진다.
- TLS Handshake를 하는 동안 클라이언트와 웹 서버는 아래 일을 수행한다.
- 사용할 TLS 버전 지정
- 사용할 암호 제품군 결정 - 공유된 암호화 키 또는 세션 키와 같은 세부 정보를 명시하는 알고리즘 집합
- 서버의 TLS 인증서를 사용하여 서버의 신원을 인증
- Handshake가 완료된 후 메시지를 암호화하기 위한 세션 키 생성
구체적인 핸드셰이크 과정은 다음과 같다.
Client : Client Hello
- 클라이언트가 서버에서 Client Hello 메시지 전송
- Client Hello 메시지의 구성 요소:
- TLS Version: 클라이언트가 지원하는 TLS 프로토콜의 버전
- 암호화 방식: 클라이언트가 지원하는 암호화 스위트 목록
- 암호화 스위트: 데이터 암호화, 키 교환, 메시지 인증 등을 위해 사용되는 암호화 알고리즘과 프로토콜
- Client Random Data: 클라이언트에서 생성한 난수로, 마스터 세션 키를 도출하는 데 사용된다.
- Session ID: 이전에 수립된 세션을 재활용하기 위한 식별자로, 세션 재개 기능을 통해 클라이언트와 서버는 이전 핸드셰이크에서 협상된 매개변수를 재사용할 수 있으며, 세션 ID를 통해 이를 식별한다.
- 초기 연결: 첫 번째 핸드셰이크에서는 일반적으로 Session ID가 비어 있다(또는 0으로 설정).
- 세션 재개: 핸드셰이크를 성공적으로 완료한 후 서버는 클라이언트에게 Session ID를 할당하는데, 클라이언트는 이 ID를 로컬에 저장하고 다음 연결 시 이 Session ID를 포함하여 서버에 전송한다.
- 서버의 응답: 서버가 저장된 Session ID를 인식하고 해당 세션이 여전히 유효하다고 판단되면, 같은 Session ID를 사용하여 세션 재개를 승인하고 전체 핸드셰이크 과정을 생략할 수 있다.
- SNI (Server Name Indication): 클라이언트가 연결하고자 하는 서버의 이름으로 하나의 서버 또는 IP 주소에 여러 도메인이 호스팅될 때 유용하며, 서버가 적절한 인증서를 클라이언트에게 제시할 수 있도록 한다.
Server : Server Hello
- 클라이언트가 보낸 Client Hello에 대한 서버의 응답이다.
- TLS Version, 암호화 방식(Client가 보낸 암호화 방식 중에 서버가 사용 가능한 암호화 방식을 선택), Server Random Data(서버에서 생성한 난수, 대칭키를 만들 때 사용), SessionID(유효한 Session ID)
Server : Server Certificate
- 서버의 인증서를 클라이언트에게 보내는 단계로 필요에 따라 CA의 Certificate도 함께 전송한다.
- 클라이언트는 이 패킷을 통해 서버의 인증서가 무결한지 검증한다.
Server : Server Hello Done
- 서버가 클라이언트에게 보낼 메시지를 모두 보냈다는 뜻
Client : Client Key Exchange
- 클라이언트는 pre-master secret을 생성하고 서버의 공개키로 암호화하여 서버에 전송한다.
- pre-master secret: 키 교환에 필요한 정보로 난수를 조합하여 만들어진다.
- 클라이언트는 pre-master secret을 생성하고 서버의 공개키로 암호화하여 서버에 전송한다.
Server : Pre-master Secret 복호화
- 서버는 자신의 개인키로 클라언트가 보낸 pre-master secret을 복호화한다.
Server & Client : Master Session Key 생성
- 클라이언트와 서버는 클라이언트의 난수와 서버의 난수를 조합하여 마스터 세션 키를 생성한다.
- 클라이언트와 서버의 난수(클라이언트 랜덤, 서버 랜덤)은 가장 초기의 Hello 단계에서 교환된다.
- 이 마스터 세션 키는 대칭키로 통신의 모든 데이터를 암호화 및 복호화하는 데 사용된다.
- 대칭키: 암호화와 복호화에 동일한 키를 사용하는 암호화 방식
- 클라이언트와 서버는 클라이언트의 난수와 서버의 난수를 조합하여 마스터 세션 키를 생성한다.
Server & Client : Change Cipher Spec
- 클라이언트와 서버는
Change Cipher Spec
메시지를 보내 서로에게 새로운 세션 키가 적용될 준비가 되었음을 알린다. - Cipher Spec은 “암호화 규격”을 의미한다.
- 클라이언트와 서버는
Client : Finished
- 클라이언트는 모든 핸드셰이크 메시지의 해시를 포함한 ‘Finished’ 메시지를 보내어 핸드셰이크 과정을 완료한다.
Server : Finished
- 서버는 클라이언트의 Finished 메시지를 검증하고, 성공적이라면 자신의 Finished 메시지를 클라이언트에게 전송한다.
- 이 단계에서 양쪽 모두 핸드셰이크가 성공적으로 완료되었음을 확인한다.
HTTP와 HTTPS의 차이점
- 보안: HTTPS는 HTTP에 비해 높은 보안을 제공합니다. HTTPS는 데이터를 암호화하고, 서버의 신원을 검증하여 보안 연결을 구축합니다.
- 포트 번호: 일반적으로 HTTP는 포트 80을 사용하고, HTTPS는 포트 443을 사용합니다.
- 성능: HTTPS는 암호화 및 복호화 과정으로 인해 HTTP보다 약간 느릴 수 있으나, 최근의 기술 발전으로 이 차이는 점점 줄어들고 있습니다.
HTTP & HTTPS 포트 번호
- 포트 80: HTTP 통신을 위한 기본 포트로, 암호화되지 않은 표준 HTTP 요청이 이 포트를 사용하여 서버와 통신한다.
- 포트 443: HTTPS(암호화된 HTTP) 통신에 사용된다. HTTPS는 SSL 또는 TLS를 사용하여 데이터를 암호화한다.
References
This post is licensed under CC BY 4.0 by the author.