1) 왜 HTTPS인가?
- HTTP는 HyperText Transfer Protocol의 줄임말로, 네트워크 상에서 데이터를 주고 받는데 사용되는 프로토콜입니다. HTTP는 현대 웹 어플리케이션 계층의 기본 프로토콜로 자리 잡았지만, 한 가지 단점을 갖고 있습니다. 그것은 바로 보안에 취약하다는 점입니다. 즉, HTTP 프로토콜을 통해서 전달되는 데이터를 악의적인 누군가가 중간에서 가로챈다면, 그 데이터는 그대로 노출되게 됩니다.
HTTPS는 HTTP over Socket secure Layer의 줄임말로, 기존의 HTTP 프로토콜에 SSL 프로토콜을 추가하여, 보안 문제를 해결했습니다. SSL 프로토콜은 2가지 암호화 방식을 결합해 HTTP 데이터를 암호화하는데, 그것은 '대칭키 암호화'와 '공개키 암호화'입니다. 이 2가지 암호화 방식을 잘 이해하는 것은 SSL 프로토콜을 이해하는데 매우 중요합니다.
2) 대칭키 암호화와 공개키 암호화
- 대칭키 암호화는 클라이언트 A와 서버 B가 하나의 키를 통해서 암호화와 복호화를 하는 것입니다.
대칭키 암호화의 장점은 공개키 암호화에 비해 속도가 빠르고 컴퓨팅 자원을 적게 소모한다는 점입니다.
반면, 대칭키 암호화의 단점은
(1) 하나의 키가 노출되는 순간 암호화된 데이터가 노출될 위험이 있다
(2) 각 클라이언트-서버 쌍마다 키가 필요하다는 점입니다.
- 공개키 암호화는 클라이언트 A와 서버 B가 공개키와 개인키라는 2개의 키를 사용해 암호화와 복호화를 하는 것입니다.
공개키 암호화의 장점은 대칭키 암호화에 비해 안전하다는 것입니다.
반면, 공개키 암호화의 단점은 대칭키 암호화에 비해 속도가 느리고 컴퓨팅 자원을 많이 소모한다는 점입니다.
3) SSL 인증서
- SSL 인증서란 클라이언트와 서버의 통신에 있어서,
제3자인 CA가 서버가 인증된 서버라는 점을 발급하는 문서입니다.
즉, SSL 인증서는 서버에 신뢰성을 부여하는 문서라고 할 수 있습니다.
여기서 CA란 Certificate Autority의 줄임말로, 아무 기업이나 할 수 있는 것은 아니고
신뢰성이 엄격히 공인된 기업들만 참여할 수 있습니다.
4) SSL 3 way handshake
- SSL 통신을 하기 위해서는 클라이언트와 서버 간에 SSL 통신이 수립(establish)되어야 하는데,
이를 SSL 3 way handshake라고 합니다.
SSL 3 way handshake은 위에서 언급한 2가지 암호화 방식인 대칭키 암호화 방식과 공개키 암호화 방식이 결합되어 사용됩니다. 그 구체적인 단계는 다음과 같습니다.
4-1) Client Hello
- 우선, 클라이언트가 서버에 접속하는데, 이 때 클라이언트는 3가지 정보를 서버에게 전달합니다.
(1) 클라이언트에서 생성한 랜덤 데이터
(2) 클라이언트에서 지원하는 암호화 방식들
(3) 세션 아이디: 클라이언트와 서버가 이미 SSL handshake를 했다면, 해당 세션을 재활용하는데,
이를 위해 세션 아이디를 전달합니다.
4-2) Server Hello
- 서버는 Client Hello에 대한 응답으로 Server Hello를 하는데, 이 과정에서 마찬가지로 3가지 정보를
클라이언트에게 전달합니다.
(1) 서버에서 생성한 랜덤 데이터
(2) 서버에서 선택한 암호화 방식
(3) SSL 인증서
- 클라이언트는 서버로부터 SSL 인증서를 받으면, 브라우저에 있는 CA 리스트에서 해당 SSL 인증서를 발급한 CA의 공개키를 찾고, 그 공개키를 통해 SSL 인증서를 복호화합니다. 이를 통해서 클라이언트는 해당 SSL 인증서가 CA의 개인키에 의해 암호화 되었다는 것을 확인할 수 있습니다.
SSL 인증서에는 2가지 정보가 들어 있는데,
(1) 서비스의 정보(인증서를 발급한 CA, 서비스의 도메인 등)
(2) 서버의 공개키 입니다.
4-3) 클라이언트는 자신의 랜덤 데이터와 서버에서 전달 받은 랜덤 데이터를 조합하여 pre master secret을 만듭니다.
그리고 SSL 인증서를 통해 전달 받은 서버의 공개키를 사용해, 이를 암호화합니다.
그 다음에 암호화된 pre master secret을 서버 측으로 전달합니다.
서버가 암호화된 pre master secret을 전달 받으면, 서버의 개인키로 그것을 복호화합니다.
그 다음에 클라이언트와 서버는 모두 pre master secret을 master secret으로 변환하고,
master secret으로 session key를 만듭니다.
-> 이제 클라이언트와 서버는 이 session key를 활용해서 대칭키 방식으로 데이터를 암호화해서 주고 받습니다.
4-4) 세션이 수립됨에 따라, 세션 단계에서 데이터를 주고 받고, 데이터의 전송이 끝나면 세션이 종료됩니다.
참고
생활코딩 HTTP https://opentutorials.org/course/228/4894
'네트워크' 카테고리의 다른 글
TCP vs UDP (0) | 2022.07.31 |
---|---|
google.com에 접속했을 때 일어나는 일 (0) | 2022.07.30 |
REST API (0) | 2022.07.19 |
TCP/IP (0) | 2022.07.04 |
파싱 (0) | 2022.06.26 |