HTTP(HyperText Transfer Protocol)란?
클라이언트와 서버 간의 자원을 교환하기 위한 TCP/IP 기반 통신 프로토콜(규약,약속)
- 특징
- 단방향성 : 서버가 먼저 응답을 보낼 수 없고 클라이언트가 요청을 보내야만 응답할 수 있다.
- 비연결성(connectionless) : 클라이언트의 요청으로 서버와 연결된 후, 요청에 대한 응답의 데이터를 전송하면 연결을 종료한다.
- 따라서, 실시간 통신을 할 수 없다.
- 문제점
- HTTP는 평문 통신이기 때문에 도청이 가능하다.
- 통신 상대가 검증된 상대인지 확인하지 않기 때문에 위장이 가능하다.
- 완전성을 증명할 수 없기 때문에 변조가 가능하다.
- 이러한 문제점을 해결하기 위해 HTTPS가 등장한다.
HTTPS(HTTP Secure)란?
- HTTP(HyperText Transfer Protocol)의 보안(Secured)버전
- SSL/TLS 프로토콜을 사용해 HTTP를 암호화하여 주고 받을 때 쓰는 통신 프로토콜
대칭키 암호화와 비대칭키 암호화
HTTPS는 대칭/비대칭키 암호화 방식 모두 사용하며 각각의 특징은 아래와 같다.
- 대칭키 암호화
- 클라이언트와 서버가 동일한 키를 사용해 암호화/복호화를 진행함
- 키가 노출되면 매우 위험하지만 연산 속도가 빠름
- 비대칭키 암호화
- 1개의 쌍으로 구성된 공개키와 개인키를 암호화/복호화 하는데 사용함
- 키가 노출되어도 비교적 안전하지만 연산 속도가 느림
비대칭키 암호화는 공개키/개인키 암호화 방식을 이용해 데이터를 암호화하고 있다. 공개키와 개인키는 서로를 위한 1쌍의 키이다.
- 공개키: 모두에게 공개가능한 키
- 개인키: 나만 가지고 알고 있어야 하는 키
암호화를 공개키로 하느냐 개인키로 하느냐에 따라 얻는 효과가 다른데, 공개키와 개인키로 암호화하면 각각 다음과 같은 효과를 얻을 수 있다.
- 공개키 암호화: 공개키로 암호화를 하면 개인키로만 복호화할 수 있다. -> 개인키는 나만 가지고 있으므로, 나만 볼 수 있다.
- 개인키 암호화: 개인키로 암호화하면 공개키로만 복호화할 수 있다. -> 공개키는 모두에게 공개되어 있으므로, 내가 인증한 정보임을 알려 신뢰성을 보장할 수 있다.
HTTPS의 동작 과정
HTTPS는 대칭키 암호화와 비대칭키 암호화를 모두 사용하여 빠른 연산 속도와 안정성을 모두 얻고 있다.
- HTTPS 연결 과정(Hand-Shaking)에서는 먼저 서버와 클라이언트 간에 세션키를 교환한다.
- 여기서 세션키는 주고 받는 데이터를 암호화하기 위해 사용되는 대칭키이며,
데이터 간의 교환에는 빠른 연산 속도가 필요하므로 세션키는 대칭키로 만들어진다. - 문제는 이 세션키를 클라이언트와 서버가 어떻게 교환할 것이냐 인데, 이 과정에서 비대칭키가 사용된다.
- 즉, 처음 연결을 성립하여 안전하게 세션키를 공유하는 과정에서 비대칭키가 사용되는 것이고,
이후에 데이터를 교환하는 과정에서 빠른 연산 속도를 위해 대칭키가 사용되는 것이다.
정리
HTTP는 클라이언트와 서버 간의 자원을 교환하기 위한 TCP/IP 기반 통신 프로토콜,
HTTPS는 HTTP에 SSL/TLS 프로토콜을 이용해 암호화하여 주고 받을 때 사용하는 통신 프로토콜
- HTTP는 암호화가 추가되지 않았기 때문에 보안에 취약하다.
- HTTPS는 안전하게 데이터를 주고받을 수 있다. 하지만 HTTPS를 이용하면 암호화/복호화의 과정이 필요하기 때문에 HTTP보다 비교적 속도가 느리다. 또한 HTTPS는 인증서를 발급하고 유지하기 위한 추가 비용이 발생하다.
그렇다면 언제 HTTP를 쓰고, 언제 HTTPS를 쓰는 것이 좋겠는가?
- 개인 정보와 같은 민감한 데이터를 주고 받아야 한다면 HTTPS를 이용한다.
- 노출이 되어도 괜찮은 단순한 정보 조회 등 만을 처리하고 있다면 HTTP를 이용하면 된다.
참조
'CS' 카테고리의 다른 글
[CS] 소프트웨어 개발 방법론 (0) | 2023.04.19 |
---|---|
[CS] 보안 문제점 (0) | 2023.04.19 |
[CS] 자주 사용하는 알고리즘과 자료구조 (0) | 2023.04.18 |
[CS] REST / RESTful API (0) | 2023.04.17 |
[CS] 프로세스와 스레드 (0) | 2023.04.14 |