CS/네트워크
HTTP
최-코드
2025. 3. 20. 15:50
HTTP/1.0
- HTTP/1.0은 기본적으로 한 연결당 하나의 요청을 처리하도록 설계되었다. 이는 RTT 증가를 불러오게 되었다.
- 즉, 요청 2개에 대해 TCP 연결에 대해 RTT가 추가적으로 들기 때문에 RTT가 증가한다는 말이다.
RTT: 패킷이 목적지에 도달하고 나서 다시 출발지로 돌아오기까지 걸리는 시간이며 패킷 왕복 시간
HTTP/1.1
- HTTP/1.0에서 발전한 것이 바로 HTTP/1.1이다.
- 한 번 TCP를 연결한 이후에 keep-alive라는 옵션으로 여러 개의 파일을 송수신할 수 있게 바뀌었다.
- 참고로 HTTP/1.0에서도 keep-alive가 있었지만 표준화가 되어 있지 않았고 HTTP/1.1부터 표준화가 되어 기본 옵션으로 설정되었다.
- 즉, HTTP/1.0과 달리 요청이 여러 개가 있을 때 TCP 연결을 한 번만 해준 후, 모든 요청을 처리한다. 스프링 부트에서도 처음 요청의 경우 응답 시간이 오래 걸리지만, 다음 부터 응답 속도가 빨라지는 이유이다. 톰캣의 기본 설정으로는 20초 동안 연결을 유지한다.
- HTTP/1.1의 헤더에는 쿠키 등 많은 메타데이터가 들어 있고 압축이 되지 않아 무겁다.
HTTP/2
HTTP/2는 HTTP/1.x보다 지연 시간을 줄이고 응답 시간을 더 빠르게 할 수 있으며 멀티플렉싱, 헤더 압축, 서버 푸시(클라이언트가 요청하지 않은 리소스 미리 전송)를 지원하는 프로토콜이다.
멀티플렉싱
- 멀티플렉싱이란 여러 개의 스트림을 사용하여 송수신한다는 것이다. 즉, 여러 요청과 응답을 병렬로 처리할 수 있다.
- 이를 통해 특정 스트림의 패킷이 손실되었다고 하더라도 해당 스트림에만 영향을 미치고 나머지 스트림은 멀쩡하게 동작할 수 있다
헤더 압축
- HTTP/1.x에는 크기가 큰 헤더가 문제였다.
- 이를 HTTP/2에서는 헤더 압축을 써서 해결하는데, 허프만 코딩 압축 알고리즘을 사용하는 HPACK 압축 형식을 가진다.
허프만 코딩
- 허프만 코딩은 문자열을 문자 단위로 쪼개 빈도수를 세어 빈도가 높은 정보는 적은 비트 수를 사용하여 표현하고, 빈도가 낮은 정보는 비트 수를 많이 사용하여 표현해서 전체 데이터의 표현에 필요한 비트양을 줄이는 원리이다.
HTTPS
- HTTP/2는 HTTPS 위에서 동작한다. HTTPS는 전송 계층인 SSL/TLS을 넣은 신뢰할 수 있는 HTTP 요청을 말한다. 이를 통해 '통신을 암호화'한다.
- 즉, HTTP 요청을 보냈을 때 전송 계층에서 SSL/TSL를 통해 암호화 된다.
SSL/TLS
- 클라이언트와 서버가 통신할 때 SSL/TLS를 통해 제 3자가 메시지를 도청하거나 변조하지 못하도록 한다.
- SSL/TLS는 보안 세션을 기반으로 데이터를 암호화하며 보안 세션이 만들어질 때 인증 메커니즘, 키 교환 암호화 알고리즘, 해싱 알고리즘이 사용된다.
- 즉, 보안 세션이 만들어지면 세션이 유지될 때까지 이를 기반으로 데이터를 암호화한다.
보안 세션
- 보안 세션이란 보안이 시작되고 끝나는 동안 유지되는 세션을 말하고, SSL/TLS는 핸드쉐이크를 통해 보안 세션을 생성한다.
- 클라이언트와 서버가 키를 공유하고 이를 기반으로 인증, 인증 확인 등의 작업이 일어나는 단 한 번의 RTT가 생긴 후 데이터를 송수신하는 것을 볼 수 있다.
- keyShare의 경우 클라이언트와 서버가 난수로 만든 개인 키를 통해 암호화 알고리즘을 적용하여 생성한 공개 키이다.
- 키 교환 암호화 알고리즘은 디피-헬만 방식을 근간으로 만들어졌다.
- 디피-헬만 키 교환 암호화 알고리즘은 y = g^x mod P를 통해 키를 만드는 것으로 앞의 식에서 g와 x와 p를 안다면 y는 구하기 쉽지만 g와 y와 p만 안다면 x를 구하기 어렵다는 원리에 기반한 알고리즘이다.
- 개인 키 a가 있을 때 공개 키 A = g^a mod p로 만들어진다.
- 이후 보안 세션은 세션 키를 기반으로 만들어지는데 세션 키는 받은 공개키^개인키 mod p로 이뤄진다.
- 동일한 세션 키가 만들어지는 거에 대한 증면은 아래 사진과 같다.
- 데이터는 앞으로 만들어진 세션 키를 토대로 암호화가 진행된다.
- 클라이언트에서 사이퍼 슈트를 서버에서 전달하면 서버는 받은 사이퍼 슈트의 암호화 알고리즘 리스트를 제공할 수 있는지 확인한다. 제공할 수 있다면 서버에서 클라이언트로 인증서를 보내는 인증 메커니즘이 시작되고 이후 해싱 알고리즘 등으로 암호화된 데이터의 송수신이 시작된다.
- 인증 메커니즘은 CA에서 발급한 인증서를 기반으로 이루어진다.
- CA에서 발급한 인증서는 서버에 저장되어 있으며, 안전한 연결을 시작하는데 있어 필요한 '공개키'를 클라이언트에 제공하고 사용자가 접속한 '서버가 신뢰'할 수 있는 서버임을 보장한다.
- CA 발급은 사이트 정보와 openssl을 통한 공개키를 CA에 제줄한다.
- CA는 공개키를 CA의 비밀키를 기반으로 CA 인증서를 발급한다.
- 해싱 알고리즘은 데이터를 추정하기 힘든 더 작고, 섞여 있는 조각으로 만드는 알고리즘이다.
- SSL/TLS는 해싱 알고리즘으로 SHA-256 알고리즘을 사용한다.
- 클라이언트는 요청 데이터(세션 키로 암호화 됨)와 이에 대한 해시값을 보내고, 동일한 해시 알고리즘을 사용해서 요청 데이터를 해시값으로 만든다. 서버에서 만든 해시값과 클라이언트에서 받은 해시값을 비교해서 무결성을 보장한다.
사이퍼 슈트
사이퍼 슈트는 키 교환 방식/인증 방식/대칭키 암호화 방식/해시 함수에 대한 정보가 들어있는 규약을 말한다.