오늘도 개발
HTTP VS HTTPS 본문
1. HTTP와 HTTPS의 차이
HTTP
1) 정보를 주고 받을 때 따로 암호화 과정을 거치지 않는다.
패스워드나 주민등록번호 등의 정보를 주고받을 때도 마찬가지이다.
공격자가 HTTP 통신에서 주고받는 패스워드를 그냥 꺼내 볼 수 있다는 뜻이다.
2) TCP/IP 모델의 전송 계층 위에서 동작한다.
물리 계층 => 네트워크 계층(IP) => 전송 계층 (TCP) => 응용 계층(HTTP)
3) 80번 포트를 사용한다.
HTTPS(HyperText Transfer Protocol Secure)
1) 암호화 과정을 추가한 HTTP.
2) TCP/IP 모델의 응용 계층 밑에 암호화 계층(SSL, TLS)을 넣어서 통신한다.
물리 계층 => 네트워크 계층(IP) => 전송 계층(TCP) => 암호화 계층(SSL, TLS) => 응용 계층(HTTP)
3) 443번 포트를 사용한다.
SSL(Secure Sockets Layer, 보안 소켓 계층)
클라이언트 컴퓨터와 서버 컴퓨터가 통신할 때 주고받는 정보를 암호화하는 표준 프로토콜.
TLS(Transport Layer Security, 전송 계층 보안)
SSL을 업그레이드한 것. 더 안전하다.
TLS을 SSL로 부르기도 한다.
두 방식 모두 TCP 기반의 프로토콜이다.
TCP의 handshake 이후 TLS handshake가 이루어진다.
2. SSL의 암호화 방법
대칭키 암호화와 비대칭키 암호화(PKI, Public Key Infrastructure)를 모두 사용한다.
대칭키 암호화는
- 클라이언트와 서버가 동일한 키로 암호화/복호화를 진행한다.
- 키가 노출되면 위험하다.
- 연산 속도가 빠르다.
비대칭키 암호화는
- 한 쌍의 키(공개키, 개인키)를 암호화/복호화에 사용한다.
- 공개키로 암호화하면 개인키로만 복호화할 수 있고, 개인키로 암호화하면 공개키로만 복호화할 수 있다.
- 키가 노출되어도 안전하다.
- 연산이 느리다.
HTTPS 통신에서 클라이언트, 서버 컴퓨터가 키를 교환할 때는 비대칭키 암호화를 사용한다.
실제 전송할 정보를 암호화 할 때는 대칭키 암호화를 사용한다.
3. HTTPS의 동작 과정
클라이언트와 서버가 주고받는 정보는 세션키라는 대칭키를 사용한다.
세션키를 전달할 때는 비대칭키를 사용한다.
1) 클라이언트가 서버에게 연결 요청 보냄
2) 서버가 공개키(인증서)를 브라우저에게 보냄
3) 브라우저는 공개키(인증서) 확인 후 세션키(데이터를 암호화할 때 쓰는 대칭키) 발급
4) 브라우저가 세션키 저장
5) 앞서 서버가 준 공개키로 세션키를 암호화한 후 서버로 보냄
6) 서버가 캐인키로 세션키를 복호화해서 저장.
7) 클라이언트, 서버가 동일한 세션키를 가짐 => 데이터 전달 시 세션키로 암호화/복호화

4. 서버의 비대칭키(공개키, 개인키) 발급 과정
서버는 인증된 기관(CA, Certified Authority)을 통해 자신의 공개키를 인증서로 만든다.
CA를 통해 인증서를 만드는 이유는 무엇일까?
자신이 CA를 통해 검증받은 서버(=믿을 수 있는 서버)라는 것을 클라이언트에게 전달할 수 있기 때문이다.
기업 A에서 Https를 사용해서 서비스를 제공하려 한다고 가정해보자.
1) A는 공개키와 개인키를 만든다.
2) CA 기업을 선택해서 공개키 관리를 맡긴다.
3) CA 기업이 CA 기업의 이름, A 서버의 공개키, 공개키의 암호화 방법 등을 담은 인증서를 만든다.
4) CA 기업에는 CA 기업만의 공개키와 개인키가 있다.
CA 기업은 위의 인증서를 자신의 개인키로 암호화해서 A 서버에게 준다.
=> 클라이언트가 CA의 공개키로 복호화할 수 있다 = CA의 인증을 받았다 = 믿을 수 있다
5) A 서버가 인증서(=A의 공개키)를 갖게 되었다.
이제 클라이언트가 https 요청을 보내면
서버는 인증서를 클라이언트(브라우저)에게 전달한 후 위에서 살펴본 것처럼 통신할 수 있다.
1) 브라우저가 A의 서버에게 연결을 요청한다.
2) A 서버가 브라우저에게 인증서(CA의 개인키로 암호화한 A의 공개키)를 전달한다.
3) 브라우저는 왠만한 CA의 공개키를 다 저장해놓고 있다.
따라서 A에게 받은 인증서를 이미 저장된 CA의 공개키로 복호화한다.
4) 복호화된 인증서에서 A 기업의 공개키를 얻는다.
5) 브라우저가 A 기업의 공개키로 세션키를 암호화한다.
6) 암호화된 세션키를 A 서버에게 전달한다.
7) A 서버는 개인키로 세션키를 복호화한다.
참고
'웹 프로그래밍 > 웹의 이해' 카테고리의 다른 글
| OAuth 2.0(Open Authorization 2.0) (0) | 2022.10.17 |
|---|---|
| 웹 서버(Web Server) VS 웹 애플리케이션 서버(WAS) (0) | 2022.10.13 |
| 도커(Docker) (0) | 2022.08.09 |
| Software Testing - TDD(Test Driven Development) (0) | 2022.08.06 |
| Software Testing - E2E Test, Integration Test, Unit Test (0) | 2022.08.04 |