💣 http는 보안상의 문제가 있다.
만약 get 요청을 보낸다면, query params에 데이터가 노출이 된다.
그렇다면 post 요청으로 body에 데이터를 담아 보내면 되지 않나?
이 경우에도 중간에 요청이 탈취되었을 때, body의 데이터가 유출될 수 있는 가능성이 있다.
⭐️ 때문에, 이 데이터를 암호화하는 것이 중요하게 된다.
그리고 http에 secure를 더한 것이 바로 https로 https는 데이터의 암호화와 인증을 통해 정보의 기밀성과 무결성을 보호한다.
구글이 https 웹사이트에 SEO 이점을 제공하기에, 서비스되는 웹 사이트들은 SEO를 위해서라도 https로 배포되어야 한다.
HTTPS가 적용된 웹 페이지는 신뢰할 수 있는 공인된 기관인 CA(Certificate Authority)에게 받은 전자 인증서로 보호된다.
CA로부터 받은 개인키를 서버가 소유한다.
클라이언트는 접속하려는 사이트의 서버에 해당하는 인증서 공개키를 획득한다.
요청을 보낼 때, 클라이언트는 공개키를 사용하여 데이터를 암호화고 이를 서버에 전송한다.
서버는 개인키를 통해서 암호화된 데이터를 복호화한다.
복호화에 실패하면 올바르지 않은 요청이 된다.
🐝 개인키는 보안상 유출되어서는 안된다.
🙏 서버와 클라이언트가 통신하기 전에 SSL/TLS 3way handshake가 일어나 서버-클라이언트가 연결된다.
(SYN -> SYN/ACK -> ACK, 순서대로 클라이언트 서버 클라이언트가 보내는 패킷 데이터)
과거에는 SSL(Secure Scokets Layer)이 사용되었고, 현재는 SSL에서 더 보안이 강화된 TLS(Transport Layer Security)가 사용된다.
TLS를 통해서 안전하게 HTTPS 연결이 일어날 수 있다.
이후 클라이언트-서버간의 통신은 SSL/TLS 프로토콜로 안전하게 이루어진다.
🎉 secure 플래그를 사용하여 쿠키가 https 프로토콜에서만 전송되도록 설정할 수 있다.
HTTPS 통신이 일어나는 과정 (클라이언트 -> 서버)
- 서버와 클라이언트가 핸드셰이크 과정을 통해서 연결된다.
클라이언트는 서버에 연결 요청을 하고, 서버는 클라이언트에 디지털 인증서(공개키 + 서버 정보)를 전달한다. - 클라이언트는 서버의 인증서를 검증하고, 서버의 공개키를 사용하여 세션 키를 생성한다.
(세션 키는 데이터를 대칭키 암호화로 암호화할 때 사용될 키) - 클라이언트는 서버의 공개키를 사용하여 세션 키로 데이터를 대칭키 암호화한다.
이 암호화된 데이터는 서버로 전송된다. - 서버는 세션 키를 사용하여 암호화된 데이터를 복호화한다.
서버는 데이터를 처리하고, 필요한 응답을 생성하여 클라이언트에게 보낸다. - 서버가 생성한 응답은 세션 키를 사용하여 암호화된다.
클라이언트는 세션 키를 사용하여 응답을 복호화하고, 원본 응답을 얻을 수 있다.
❄️ let's encrypt는 안전한 인터넷 세상을 위해서 무료로 TLS를 제공해준다.
Let's Encrypt
letsencrypt.org
'기타' 카테고리의 다른 글
MVVM과 MVI에 대해서 (0) | 2023.09.21 |
---|---|
Jetpack Compose 간단하게 알아보기 (Android에서 React 처럼 선언식으로 UI 작성하기) (0) | 2023.09.16 |
Kotlin의 기초 문법 알아보기 (0) | 2023.09.09 |
React 개발자가 공부해본 SwiftUI (0) | 2023.09.07 |
animation 성능 향상 (requestAnimationFrame) (0) | 2023.09.04 |