data_buddha.log
로그인
data_buddha.log
로그인
[네트워크] 응용 계층 - HTTP 응용
data_buddha
·
2024년 11월 24일
팔로우
0
http
네트워크
0
쿠키
HTTP의 stateless한 특성을 보완하기 위한 수단
서버에서 생성되어 클라이언트 측에 저장되는 <이름, 값> 형태의 데이터
이외에도 만료기간 같은 추가적인 속성값도 가질 수 있음
클라이언트는 서버로부터 받은 쿠키를 주로 브라우저에 저장
추후 같은 서버에 요청을 보낼 때 요청 메시지에 쿠키를 포함하여 전송
서버가 클라이언트에게 쿠키를 전송할 때는 응답 메시지의 "Set-Cookie 헤더"가 활용
클라이언트가 서버에게 쿠키를 송신할 때에는 "Cookie 헤더"가 활용
어떤 서버로부터 쿠키를 전달받으면 해당 서버에게 보내는 요청 메시지에는 자동으로 전달받은 쿠키가 포함
쿠키의 속성
domain과 path 속성을 통해 쿠키를 전송할 도메인과 경로를 제한할 수 있음
Expires와 Max-age 속성으로 쿠키의 유효기간을 명시하여 유효기간이 지나면 해당 쿠키는 삭제되어 전달 x
Secure 속성은 HTTPS를 통해서만 쿠키를 송수신하도록 하는 속성
HttpOnly 속성은 자바스크립트를 통한 쿠키의 접근을 제한하고, 오직 HTTP 송수신을 통해서만 쿠키에 접근하도록 함
웹 스토리지: 로컬 스토리지와 세션 스토리지
웹 스토리지: 브라우저 내의 저장 공간, 일반적으로 쿠키보다 더 큰 데이터를 저장할 수 있음
쿠키는 서버로 자동 전송되지만, 웹 스토리지의 정보는 서버로 자동 전송되지 않음
로컬 스토리지는 별도로 삭제하지 않는 한 영구적으로 저장 가능
세션 스토리지는 세션이 유지되는 동안(브라우저가 열려있는 동안) 유지되는 정보
캐시
캐시 메모리는 "메모리에 접근하는 시간을 줄이기 위해 자주 참조되는 내용을 저장하는 장치"
HTTP에서도 이와 유사한 개념인 HTTP 캐시가 있음
HTTP의 캐시는 "응답받은 자원의 사본을 임시 저장하여 불필요한 대역폭 낭비와 응답 지연을 방지하는 기술"
응답 메시지에 캐시의 유효기간을 설정할 수 있음
클라이언트가 응답받은 자원을 임시 저장하여(캐시하여) 이용하다가 유효기간이 만료되면 다시 서버에 자원을 요청해야 함
캐시에 유효기간이 존재하는 이유는 "클라이언트가 캐시를 참조하는 사이 서버의 원본 데이터가 변경되어 원본 데이터와 캐시된 사본 데이터 간의 일관성이 깨질 수 있기 때문"
캐시된 사본 데이터와 원본 데이터가 얼마나 유사한지의 정도는 "캐시 신선도"라고 표현
캐시된 데이터의 유효 기간이 만료되었더라도, 서버의 원본 데이터가 변경되지 않았다면 서버로부터 같은 자원을 응답받을 필요가 없음
따라서 클라이언트는 캐시의 유효 기간이 만료되었을 때, 서버에게 "원본 자원이 변경된 적이 있는지" 질의
클라이언트가 서버에게 원본 데이터의 변경 여부를 물을 때에는 "날짜"를 기반으로 묻거나, "엔티티 태그"를 기반으로 물을 수 있음
날짜를 기반으로 물을 때에는 "If-Modified_Since 헤더"를 통해서
서버의 응답으로는
서버가 요청받는 자원이 변경된 경우 : 상태 코드 200과 함께 새로운 자원을 반환
서버가 요청받는 자원이 변경되지 않은 경우 : 304(Not Modified) 상태 코드와 함께 Last-Modified 헤더로 마지막 변경 시점을 알림
서버가 요청받는 자원이 없는 경우 : 404 상태 코드 전송
엔티티 태그 기반
Etag라고 부르는 "엔티티 태그"
"자원의 버전"을 식별하기 위한 정보
자원이 변경될 때마다 자원의 버전을 식별하는 Etag값이 변경되고, 반대로 자원이 변경되지 않으면 Etag 값도 변경되지 않음
대표적인 요청 헤더 "If-None-Match 헤더"를 통해서 이루어짐
서버의 응답은 위의 3가지 경우와 같음
콘텐츠 협상
실은 HTTP 메시지를 통해 주고받는 것이 "자원"이 아니라, "자원의 표현"
"표현"이란 송수신 가능한 자원의 형태를 의미
같은 자원에 대해 할 수 있는 여러 표현 중(ex> xml, json, jpg, txt...) 클라이언트가 가장 적합한 자원의 표현을 제공하는 기술을 "콘텐츠 협상"이라고 함
클라이언트가 선호하는 자원의 표현을 "콘텐츠 협상 헤더"를 통해 서버에게 전송하면, 서버는 클라이언트가 요청한 자원의 표현을 응답
Accept: 선호하는 미디어 타입을 나타내는 헤더
Accept-Language: 선호하는 언어를 나타내는 헤더
Accept-Encoding: 선호하는 인코딩 방식을 나타내는 헤더
보안: SSL/TLS와 HTTPS
HTTPS는 HTTP에 SSL 혹은 TLS라는 프로토콜의 동작이 추가된 프로토콜
SSL Secure Socket Layer과 TLS Transport Layer Security는 모두 인증과 암호화를 수행하는 프로토콜로, TLS는 SSL을 계승한 프로토콜
TLS 1.3기반 HTTPS 메시지는 크게 아래와 같은 단계를 거쳐 전송
TCP 쓰리 웨이 핸드셰이크
TLS 핸드 셰이크
메시지 송수신
2번의 과정을 거쳐 서로에 대한 인증과 메시지 암호화가 이루어지므로, 2번을 거쳐 3번에서 주고받는 메시지는 암호화된 메시지
TLS 핸드 셰이크의 핵심 내용은 크게 2가지
TLS 핸드 셰이크를 통해 암호화 통신을 위한 키를 생성/교환이 가능
인증서 송수신과 검증이 이루어질 수 있음
암호화 통신을 위한 키 생성/교환
TLS에서 활용되는 암호화 알고리즘을 통해 평문을 암호화하거나 복호화하려면 "키"라는 정보가 필요
"키"는 암호화 통신을 수행하는 두 호스트만 알고 있어야 하는 정보로,
TLS 핸드셰이크 과정에서 "ClientHello 메시지", "ServerHello 메시지"를 주고 받으며 생성/교환
ClientHello 메시지에는 "사용 가능한 암호화 알고리즘과 해시 함수"를 서버에 알리기 위한 정보가 포함
이 정보를 "암호 스위트"
ServerHello 메시지는 제시된 암호 스위트들을 선택하는 메시지
선택된 TLS의 버전, 암호 스위트 등의 정보, 등이 포함
ClientHello와 ServerHello메시지를 주고 받으면 암호화된 통신을 위해 협의되어야 할 정보들이 결정되고, 결정된 정보를 토대로 "키"를 만들어 암호화/복호화 할 수 있도록 함
인증서 송수신과 검증
인증서는 "당신이 통신을 주고받는 상대방은 틀림없이 당신이 의도한 대상이 맞다"라는 사실을 입증하기 위한 정보
인증서를 발급하고 검증하는 제 3의 "인증기관(CA)" 공인 기관
TLS에서 인증서 관련한 메시지로는 "Certificate"와 "CertificateVerify" 메시지
Certificate 메시지에는 인증서 내용들이 포함
CertificateVerify 메시지에는 인증서의 내용이 올바른지 검증하기 위한 내용들이 포함
암호화에 사용할 키, 인증서 확인한 후 TLS 핸드셰이크의 마지막을 의미하는 Finished 메시지를 주고받고, TLS 핸드셰이크를 통해 얻어낸 키를 기반으로 암호화된 데이터를 주고 받음
data_buddha
来日方长 : 앞길이 구만리 같다; 앞길이 희망차다. 장래의 기회가 많다.
팔로우
이전 포스트
[네트워크] 응용 계층 - HTTP의 기초
0개의 댓글
댓글 작성