HTTP
HTTP(Hyper Text Transfer Protocol)은 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜 입니다.
웹 브라우저와 웹 서버간의 통신을 위해 디자인 되었습니다.
HTTP 요청이 발생하면 브라우저는 HTTP 요청 메시지를 생성하고 TCP/IP 프로토콜을 이용하여 웹 서버에 요청을 전달합니다.
이후 브라우저는 웹 서버로부터 HTTP 응답을 전달 받습니다.
HTTP요청 메시지는
크게 startline, 헤더와 바디로 구성되고
startline에는 메소드, 경로, 프로토콜의 버전이 추가됩니다.
헤더에는 요청에 설정한 HTTP 헤더들이 들어갑니다.
바디에는 POST 요청일 경우에 추가되고 다른 메서드의 경우에는 추가되지 않습니다.
HTTP 응답 메시지에는
크게 startline, 헤더와 바디로 구성됩니다.
startline에는 프로토콜 버전, 상태 코드, 상태 텍스트 (ex. HTTP/1.1 404 Not found)
헤더에는 응답에 설정한 HTTP 헤더,
바디에는 요청에 대한 응답이 들어갑니다. 상태가 201(created), 204(no content)일 경우에는 보통 본문이 없습니다.
HTTPS랑 HTTP의 차이점
HTTP는 데이터가 암호화 되지 않으므로 중간에 채가면 그 데이터를 볼 수가 있습니다.
HTTPS(HyperText Transfer Protocol Secure)는 HTTP + Secure 입니다.
HTTPS에서는 바디의 내용만 암호화 해서 보냅니다.
1. 보안성
SSL이 적용되었습니다. 이제 요청과 응답의 내용은 암호화가 되어서 서로에게 보내집니다.
2. 검색엔진 최적화
구글은 HTTPS 웹 사이트에 가산점을 줍니다
SSL은 서버와 브라우저 사이에 안전하게 암호화된 연결을 만들 수 있게 도와주고,
서버와 브라우저가 민감한 정보를 주고받을 때 해당 정보가 도난당하는 것을 막아줍니다.
SSL의 업그레이드 버전이 TLS
Let's Encrypt, AWS Certificate Manager(ACM)는 SSL인증서를 무료로 발급해주는 서비스
SSL은 웹 서버와 웹 브라우저간의 보안을 위해 만든 프로토콜, 공개키/개인키, 대칭키 기반으로 사용
대칭키 방식 -> 같은 키로 암호화/복호화 하는것
대칭키의 문제는 결국 클라이언트/서버에서 다른 쪽으로 대칭키를 전송해야 한다는 문제
이 전송하는 과정에서 누군가 채간다면 키는 노출되어 버린다.
공개키 (비대칭키) 방식이란?
비대칭키(공개키) 방식 -> A(공개키), B(개인키)가 쓰임
A키로 암호화를 하면 B키로만 복호화를 할 수 있음, B키로 암호화를 하면 A키로만 복호화를 할 수 있음
유명 사이트에서는 자신들의 공개키를 대중에 공개하고 클라이언트에서는 이 공개키를 자신의 요청을 암호화합니다.
이게 중간에 채가도 문제가 없는게 비밀키는 사이트 서버에만 존재하기 때문에 복호화 자체가 안됨
비대칭키 방식은 대칭키 방식에 비해 연산이 많이 필요하게 됩니다. (컴퓨터에 부하가 걸림)
그래서 현대의 웹에서는 HTTPS 프로토콜에서 비대칭키/대칭키 방식을 혼합해서 사용합니다.
아래의 SSL HandShake 방식에서 단계별로 살펴보겠습니다.
SSL HandShake
네이버에서 보내는 정보들은 일부가 네이버의 개인키로 암호화가 되어있습니다.
네이버의 공개키로 복호화할수 있는건 네이버의 개인키로 암호화 된것 뿐입니다.
신뢰할 수 있는 기간에서 네이버의 공개키가 맞다고 인증만 해주면 우리는 이 공개키를 안전하게 사용할 수 있습니다.
네이버의 공개키가 정품인지를 확인할 수 있어야 함
정품인지를 확인해주는 곳이 CA(Certificate Authority) 입니다.
브라우저에는 CA 기관들의 목록과 공개키가 내장되어 있습니다.
사전 정보
서버에서의 HTTPS 적용
서버에서는 자신의 정보와 서버의 공개키를 CA에게 넘깁니다.
CA 에서는 자신의 개인키로 암호화한 인증서를 서버에게 보내줍니다.
브라우저에는 CA 인증서들의 목록과 이들의 공개키가 내장되어 있습니다
SSL handshake
과정
- 클라이언트는 서버에게 랜덤데이터, SSL의 버전정보등을 서버에게 보냅니다.
- 서버에서는 응답으로 서버에서 생성한 랜덤데이터와 서버의 인증서를 보냅니다.
- 클라이언트는 CA의 목록을 이용하여 이 인증서가 진짜인지 확인하는 과정을 가집니다.
CA의 인증을 받은 인증서들은 CA의 개인키로 암호화가 되어있습니다.
이 인증서가 진짜라면 브라우저에 저장된 CA의 공개키로 복호화 할 수 있을 것입니다(CA의 개인키로 암호화된 것은 CA의 공개키로 밖에 복호화를 할 수 없습니다.)
이 복호화된 인증서에는 서버의 공개키가 들어있습니다.
지금부터 주고받는 데이터들은 대칭키/비대칭키 방식이 혼합되어서 사용됩니다.
(비대칭키 방식으로 암/복호화 하는것은 대칭키 방식보다 컴퓨터에 부담이 크므로 둘을 혼합해서 사용하게 됩니다.) - 클라이언트에서는 1,2번 과정에 오고간 두개의 랜덤데이터를 이용해서 임시키를 만듭니다.
이 임시키는 서버의 공개키로 암호화 되서 서버로 보내집니다. - 서버에서는 서버의 공개키로 암호화 된 키를 서버의 개인키로 복호화 합니다
복호화한 정보에는 클라이언트에서 생성한 임시 대칭키가 있습니다.
이제 클라이언트, 서버 둘다 동일한 대칭키를 가지게 됨 - 이제 데이터들은 이 대칭키를 이용해서 암/복호화 하게 됩니다.
출처 : https://www.youtube.com/watch?v=wPdH7lJ8jf0
https://www.youtube.com/watch?v=H6lpFRpyl14
'네트워크' 카테고리의 다른 글
네트워크 JWT 🗝 (0) | 2022.04.19 |
---|---|
주소창에 www.google.com을 입력하면?(성공과 실패를 결정하는 1% 네트워크 원리) (0) | 2022.04.17 |
네트워크 HTTP, HTTP 1.1, HTTP 2.0 🔥 (0) | 2022.04.16 |
html5, 웹 표준 및 웹 접근성 🔥 (0) | 2022.04.13 |
쿠키, 세션 🔥 (0) | 2022.04.11 |