HTTP와 HTTPS
HTTP(HyperText Transfer Protocol)
HTTP(Hyper Text Transfer Protocol)는 인터넷에서 데이터를 주고받을 수 있는 프로토콜
클라이언트와 서버 사이에 이루어지는 요청/응답 (request/response) 프로토콜
HTTP의 특징
- TCP와 UDP를 사용하며, 80번 포트를 사용
- 비연결성(Connectionless)
- 클라이언트가 요청을 서버에 보내고 서버가 적절한 응답을 클라이언트에 보내면 바로 연결이 끊어짐
- 무상태성(Stateless)
- 연결을 끊는 순간 클라이언트와 서버의 통신은 끝나며 상태 정보를 유지하지 않음
HTTP Message의 구조
HTTP는 어플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동한다. HTTP는 상태를 가지고 있지 않는 Stateless 프로토콜로, 메세지는 Method, Path, Version, Headers, Body 등으로 구성된다.
HTTP 동작 과정
클라이언트 → 요청 → 서버 → 응답 → 클라이언트
- 사용자가 웹 브라우저에 URL 주소 입력
- DNS 서버에 웹 서버의 호스트 이름을 IP 주소로 바꿔달라고 요청
- 웹 서버와 TCP 연결 시도
- 3way-handshaking
- 클라이언트가 서버에게 요청
- HTTP Request Message = Request Header + 빈 줄 + Request Body
- 여기서 빈 줄은 모든 메타 정보가 전송되었음을 알리는 용도
- 서버가 클라이언트에게 데이터 응답
- HTTP Response Message = Response Header + 빈 줄 + Response Body
- 여기서 빈 줄은 모든 메타 정보가 전송되었음을 알리는 용도
- 서버 클라이언트 간 연결 종료
- 4way-handshaking
- 웹 브라우저가 웹 문서 출력
암호화
단방향 암호화
- Hash를 활용한 암호화 방식으로 암호화는 가능하지만 복호화가 불가능한 암호화 기법
- ex ) 비밀번호 암호화, SHA-256 암호화 알고리즘
양방향 암호화
- 암호화와 복호화가 모두 가능한 암호화 기법
- 대칭키 암호화, 비대칭키 암호화
대칭키 암호화
- 암호화와 복호화에 같은 키를 사용하는 암호화 기법
- 동일한 키로 암호화와 복호화를 모두 진행되기 때문에 키가 노출되면 매우 위험하지만 연산속도가 빠르다는 장점이 있음
비대칭키 암호화
- 암호화와 복호화 시 서로 다른 키 (공개키, 개인키)를 사용하는 암호화 기법
- 공개키 : 공개적으로 개방되어 있는 키
- 개인키 : 타인에게 절대 노출이 되어서는 안되는 키
- 암호화는 공개키로 할 수도 있고, 개인키로 할 수도 있음(복호화도 마찬가지)
- 따라서 비대칭키 암호화는 두 가지 방식으로 암/복호화를 진행할 수 있음
- HTTPS 프로토콜은 아래의 두 가방식이 순차적으로 진행됨
1. 개인키로 암호화 + 공개키로 복호화 → 인증에 사용
- 클라이언트와 서버는 서로를 확인하기 위해 handshake를 진행
- 서버는 CA(공인 인증 기관)에서 인증받은 인증서(CA의 개인키로 암호화된 전자 서명)를 클라이언트로 보냄
- 사용자는 CA의 목록을 확인해서 공인 인증기관이 서명한 인증서인지 확인
- CA의 공개키를 이용해서 해당 인증서를 복호화
- 세계적으로 신뢰할 수 있는 CA 기업의 공개키는 브라우저가 이미 알고 있음
- 복호화에 성공하면 서버의 공개키를 얻음
2. 공개키로 암호화 + 개인키로 복호화 → 데이터 보안
- 사용자가 서버로 보내는 데이터는 개인정보와 같은 중요한 데이터이기 때문에 서버만 유일하게 가지고 있는 개인키로만 복호화가 가능하도록 함
- HTTPS 프로토콜 통신 과정은 위의 1, 2번 방식과 동일하게 동작, 추가적으로 2번 과정에서 클라이언트가 Private Data로 세션키를 발급하여 해당 세션키를 서버에 전송
HTTPS (HyperText Transfer Protocol over Secure Socket Layer)
웹 통신 프로토콜인 HTTP의 보안이 강화된 버전의 프로토콜
- HTTPS의 기본 TCP/IP 포트로 443번 포트를 사용
- 일반 텍스트를 이용하는 대신에, 웹 상에서 정보를 암호화 하는 SSL이나 TLS 프로토콜을 통해 세션 데이터를 암호화
- TLS(Transport Layer Security) 프로토콜은 SSL(Secure Socket Layer) 프로토콜에서 발전한 것
- 위 두 포로토콜의 주 목표는 기밀성, 데이터 무결성, ID 및 디지털 인증서를 사용한 인증 제공
- 금융 정보나 메일 등 중요한 정보를 주고받는 것은 HTTPS, 아무나 봐도 상관없는 페이지는 HTTP
HTTPS는 왜 필요할까?
HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이었기 때문에, HTTP로 비밀번호나 주민등록번호 등을 주고 받으면 제 3자가 정보를 조회할 수 있었다. 이러한 문제를 해결하기 위해 나온 것이 HTTPS
HTTPS의 원리
- 공개키 알고리즘 방식
- 대칭키 암호화 방식(비밀키 암호화 방식)
- 하나의 비밀키를 이용한 암호화 방식
- 비대칭키 암호화 방식(공개키 암호화 방식)
- 공개키(public)와 개인키(private)를 이용한 암호화 방식
- 대칭키 암호화 방식(비밀키 암호화 방식)
- 암호화, 복호화시킬 수 있는 서로 다른 키(공개키, 개인키)를 이용한 암호화 방법
- 공개키: 모두에게 공개. 공캐키 저장소에 등록
- 개인키(비공개키): 개인에게만 공개. 클라이언트-서버 구조에서는 서버가 가지고 있는 비공개키
- 클라이언트 -> 서버
- 사용자의 데이터를 공개키로 암호화 (공개키를 얻은 인증된 사용자)
- 서버로 전송 (데이터를 가로채도 개인키가 없으므로 복호화할 수 없음)
- 서버의 개인키를 통해 복호화하여 요청 처리
HTTPS 동작 과정 (SSL)
- 공개키 암호화 방식과 대칭키 암호화 방식의 장점을 활용해 하이브리드 사용
- 데이터를 대칭키 방식으로 암복호화하고, 공개키 방식으로 대칭키 전달
- 클라이언트가 서버 접속하여 Handshaking 과정에서 서로 탐색
- 클라이언트가 서버에게 전송할 데이터
- 클라이언트 측에서 생성한 랜덤 데이터
- 클-서 암호화 방식 통일을 위해 클라이언트가 사용할 수 있는 암호화 방식
- 이전에 이미 Handshaking 기록이 있다면 자원 절약을 위해 기존 세션을 재활용하기 위한 세션 아이디
- Client Hello에 대한 응답으로 전송할 데이터
- 서버 측에서 생성한 랜덤 데이터
- 서버가 선택한 클라이언트의 암호화 방식
- SSL 인증서
- 서버로부터 받은 인증서가 CA에 의해 발급되었는지 본인이 가지고 있는 목록에서 확인하고, 목록에 있다면 CA 공개키로 인증서 복호화
- 클-서 각각의 랜덤 데이터를 조합하여 pre master secret 값 생성(데이터 송수신 시 대칭키 암호화에 사용할 키)
- pre master secret 값을 공개키 방식으로 서버 전달(공개키는 서버로부터 받은 인증서에 포함)
- 일련의 과정을 거쳐 session key 생성
- 서버는 비공개키로 복호화하여 pre master secret 값 취득(대칭키 공유 완료)
- 일련의 과정을 거쳐 session key 생성
- 클라이언트가 서버에게 전송할 데이터
- 1.1. Client Hello
- 데이터 전송
- 서버와 클라이언트는 session key를 활용해 데이터를 암복호화하여 데이터 송수신
- 연결 종료 및 session key 폐기
'CS > 네트워크' 카테고리의 다른 글
ARQ Stop and Wait, Go Back N, SR (0) | 2022.12.31 |
---|---|
3 Way-Handshake, 4 Way-Handshake (2) | 2022.12.19 |
REST와 REST API (1) | 2022.11.29 |
HTTP 메소드와 상태코드 (0) | 2022.11.29 |
OSI 7계층 & Internet 5계층 (0) | 2022.11.27 |