HTTP란?
- HyperText Transfer Protocol
- 서버/클라이언트 모델을 따라 데이터를 주고받기 위한 프로토콜
- 인터넷에서 하이퍼텍스트를 교환하기 위한 통신 규약
- TCP/IP 80번 포트를 사용한다.
- 보안에 대한 조치가 따로 없기 때문에 보안에 취약하다.
- 상태 정보를 저장하지 않는 Stateless의 특징을 가지고 있다.
- 클라이언트의 요청에 맞는 응답을 보낸 후 연결을 끊는 Connectionless의 특징을 가지고 있다.
HTTPS란?
- HyperText Transfer Protocol Secure
- HTTP의 보안이 강화된 버전이다.
- 기존 HTTP 레이어에서 SSL(TLS) 프로토콜을 얹어 평문 데이터를 암호화 한다.
- TCP/IP 443번 포트를 사용한다.
- 인증기관(CA)로부터 SSL 인증서를 발급받아야 사용 가능하다.
SSL 인증서
- 웹 사이트나 어플리케이션과 사용자 간의 통신을 보호하기 위해 사용되는 디지털 인증서
인증서 발급 과정 및 원리
- 서버에서 서버의 공개키와 비밀키를 생성
- 서버에서 인증서를 발급받기 위해 CA에 서버의 공개키와 서버의 정보를 전달
- 서버로부터 받은 정보들을 받아서 CA에서 SSL 인증서를 발급
- 발급한 SSL 인증서를 암호화 하기 위해 CA의 공개키와 비밀키를 생성하고 이 비밀키를 이용해 SSL 인증서를 암호화
- 암호화한 SSL 인증서를 다시 서버에 전달하여 인증서 발급 완료
SSL Handshake
- 데이터의 암호화 및 서버 신원 확인을 위한 프로토콜
- TCP 연결이 설정된 후에 발생
동작 과정
- Client -> Server로 연결 시도
- 클라이언트에서 통신하고 싶은 서버로 연결을 시도하는 패킷 전송
- 패킷에 클라이언트가 사용 가능한 cipher suit 목록이 있음 -> 여기에 어떤 프로토콜을 사용할지 표시
- 클라이언트에서 통신하고 싶은 서버로 연결을 시도하는 패킷 전송
- Server -> Client 응답
- 1번에서 받은 요청에 대해 서버가 응답
- 클라이언트에서 받은 cipher suite 목록중 선택한 1개의 cipher suite를 담아서 응답
- Server -> Client
- Server는 2번의 패킷 외에 클라이언트에게 Certificate라는 내용의 패킷을 보냄
- Certificate 패킷에 서버의 SSL 인증서가 들어있음
- 이 외에도 패킷중에 Server Key Exchange도 있는데 SSL 인증서 내의 서버의 공개키가 없는 경우
서버가 직접 전달한다. -> 인증서 내부에 서버의 공개키가 있는 경우 생략됨
- Server는 2번의 패킷 외에 클라이언트에게 Certificate라는 내용의 패킷을 보냄
- Client에서 Server의 인증서 검증
- 클라이언트에서 서버로부터 전달 받은 서버의 SSL 인증서를 검증
- 클라이언트는 SSL 인증서를 발급한 해당 CA의 공개키를 이용해서 복호화를 진행
-> 해당 CA에서 발급되었다라는 것을 검증 가능
- 클라이언트는 SSL 인증서를 발급한 해당 CA의 공개키를 이용해서 복호화를 진행
- 클라이언트에서 서버로부터 전달 받은 서버의 SSL 인증서를 검증
- Client -> Server 대칭키(비밀키) 전달
- 클라이언트는 서버와 원하는 데이터를 안전하게 주고받기 위해서 전달하는 데이터를 암호화해야 함
-> 데이터를 암호화하기 위한 대칭키(비밀키) 생성 - 클라이언트는 대칭키(비밀키)를 서버만 볼 수 있게 하기 위해, 서버의 공개키로 암호화해서
서버에 전달(Client Key Exchange) -> SSL 인증서를 검증하는 과정에서 서버의 공개키를 얻음
- 클라이언트는 서버와 원하는 데이터를 안전하게 주고받기 위해서 전달하는 데이터를 암호화해야 함
- Server / Client SSL Handshake Finished
- 서버는 클라이언트가 전달한 암호화된 대칭키(비밀키)를 받아 서버의 비밀키로 복호화
-> 서버의 공개키로 암호화를 하였기 때문에 서버에서 서버의 비밀키로 복호화 가능 - 서버와 클라이언트 모두 동일한 대칭키(비밀키)를 갖고 있으니 통신이 가능해짐
- 서버는 클라이언트가 전달한 암호화된 대칭키(비밀키)를 받아 서버의 비밀키로 복호화
암호화 방식
대칭키 암호화
- 클라이언트와 서버가 동일한 키를 사용해 암호화/복호화 진행
- 키가 노출되면 위험하지만 연산 속도가 빠름
비대칭키 암호화
- 1개의 쌍으로 구성된 공개키와 개인키를 암호화/복호화 하는데 사용함
- 키가 노출되어도 비교전 안전하지만 연산 속도가 느림
참고 블로그
'CS(Computer Science)' 카테고리의 다른 글
CS Study 3주차 : TLS/SSL HandShake (1) | 2022.11.16 |
---|---|
CS Study 2주차 : HTTPS method GET vs POST (0) | 2022.11.09 |
CS Study 2주차 : 대칭키와 공개키 (0) | 2022.11.09 |
CS Study 1주차 : TCP vs UDP (0) | 2022.11.05 |
CS Study 1주차 : OSI 7계층 (1) | 2022.11.05 |