[네트워크] HTTP 下

windowook·2024년 7월 15일
post-thumbnail

🌱 HTTP 헤더

요청 헤더 종류

Host
요청을 보내는 호스트입니다. 주로 도메인 네임으로 명시되고 포트 번호가 포함됩니다.

User-Agent
Host와 같이 HTTP 요청 메세지에서 흔하게 볼 수 있는 헤더입니다. User-Agent에는 요청 메세지 생성에 관여한 클라이언트 프로그램과 관련된 다양한 정보가 존재합니다. 브라우저 호환, 운영체제 및 아키텍처 정보, 렌더링 엔진 관련 정보, 브라우저와 버전 정보를 포함합니다.

Referer
클라이언트가 요청을 보낼 때 머무르고 있던 URL을 포함합니다. Referrer가 원래는 맞는 문법이나 초기에 명명할 때 Referer라고 정해버려서 그대로 사용 중입니다.

Authorization
클라이언트의 인증 정보를 담는 헤더입니다. 인증 타입과 인증을 위한 정보가 차례로 명시되어있습니다.
인증 타입에 따라 인증 정보에 명시될 값 상이합니다.

인증 타입의 종류는 다양하지만 가장 기본적인 HTTP 인증 타입은 Basic이라는 타입입니다. Basic은 username:password와 같이 사용자 아이디와 비밀번호를 콜론을 이용해서 합친 뒤 Base64 인코딩을 하여 인증 정보로 이용합니다.

아이디가 'wook', 비밀번호가 '7274'라면 'wook:7274'를 Base64 인코딩 했을 때 'd29vazo3Mjc0'가 나오고 이걸 Basic 타입의 인증 정보로 사용합니다.

응답 헤더 종류

Server
요청을 처리하는 서버 측의 소프트웨어와 관련된 정보를 명시합니다.

Allow
클라이언트에게 허용된 HTTP 메서드 목록을 알려주기 위해 사용합니다.

Retry-After
상태 코드 503(Service Unavailable)과 함께 사용합니다.
자원을 사용할 수 있는 날짜 혹은 시각입니다.

Location
클라이언트에게 자원의 위치를 알려주기 위해 사용합니다.
주로 리다이렉션이나 새로운 자원이 생성되었을 때 사용합니다.

WWW-Authenticate
상태 코드 401(Unauthorized)와 함께 사용합니다.
자원에 접근하기 위한 인증 방식을 설명합니다.
그리고 보안 영역, 인증에 사용될 문자집합도 같이 표기합니다.

양쪽 다 사용되는 헤더 종류

Date
메세지가 생성된 날짜와 시각에 관련된 정보입니다.

Connection
클라이언트의 요청과 응답 간의 연결 방식을 설정하는 헤더입니다.
여기에는 대표적으로 keep-alive, close가 붙습니다.

Content-Length
본문의 바이트 단위 크기(길이)입니다.

Content-Type, Content-Language, Content-Encoding
전송하려는 메세지 본문의 표현 방식을 설명하는 헤더입니다. 표현 헤더 중 하나입니다.

  • Content-Type: 메세지 본문에서 사용된 미디어 타입입니다.
  • Content-Language: 메세지 본문에 사용된 자연어를 명시합니다.
    첫 번째 서브 태그와 두 번째 서브 태그까지 사용하여 언어 태그로 명시합니다.
    첫 번째 서브 태그는 언어, 두 번째 서브 태그는 국가를 의미합니다.
  • Content-Encoding: 메세지 본문을 압축하거나 변환한 방식 명시합니다.

🌱 캐시

불필요한 대역폭 낭비와 응답 지연을 방지하기 위해 정보의 사본을 임시로 저장하는 기술입니다.
캐시는 웹 브라우저에 저장되기도 하고 클라이언트와 서버 사이에 위치한 중간 서버에 저장되기도 합니다.

개인 전용 캐시

웹 브라우저에 저장되는 형태의 캐시입니다.
캐시를 했다면 항상 캐시한 이후로 원본 데이터가 변경되는 상황에 대비가 필요합니다.

캐시 신선도
캐시된 사본 데이터와 최신 원본 데이터 사이의 유사도입니다.
캐시 신선도를 유지하는 방법은 리액트 쿼리를 써봤다면 이해하겠지만 캐시된 데이터에 유효 기간을 설정하는 방법을 사용합니다. (staleTime) 캐시 데이터에 유효 기간을 설정하고 기간이 만료되었다면 원본 데이터를 다시 요청하는 방식으로 캐시 신선도를 유지합니다.

클라이언트 입장에서 응답 메세지를 받는 상황을 가정하면, 클라이언트가 응답받은 자원을 캐시해서 이용하다가 캐시의 유효 기간이 만료되면 서버에게 자원을 다시 요청합니다. 캐시의 유효 기간이 만료되었더라도, 원본 데이터가 변하지 않았다면 서버는 굳이 같은 자원을 전송하지 않아도 됩니다.

캐시의 유효 기간이 만료되면 클라이언트는 자원이 여전히 신선한지, 최신인지 상태 정보를 재검사 하는데 날짜를 기반으로 서버에게 물어보는 방법도 있고 엔티티 태그를 기반으로 서버에게 물어보는 방법도 존재합니다.

날짜 기반
날짜를 기반으로 검사하게 되면 클라이언트가 'If-Modifed-Since'라는 헤더를 서버에게 보내서
특정 시점 이후 원본 데이터에 변경 사항이 있는지 체크합니다. 이 헤더의 값이 특정 시점을 명시하는 건데, 원본에 변경 사항이 있다면 그 때만 새 자원으로 응답받도록 서버에게 요청하는 방식입니다.

ex)
서버가 If-Modified-Since 헤더가 포함된 요청 메세지를 수신

  • 요청 받은 자원이 변경됨
  • 요청 받은 자원이 변경되지 않았음
  • 요청 받은 자원이 삭제됨

변경 O → 서버는 상태 코드 200(ok)와 함께 새로운 자원을 반환합니다.
변경 X → 서버는 메세지 본문 없는 상태 코드 304(Not Modified)를 통해서 클라이언트에게 변경 없음을 알립니다.
삭제 → 서버는 상태 코드 404(Not Found)를 통해서 요청한 자원이 삭제되었음을 알립니다.

엔티티 태그 기반
엔티티 태그는 자원의 버전을 식별하기 위한 정보입니다. 버전이란 유의미한 변경 사항입니다.
자원이 변경될 때마다 버전을 식별하는 Etag 값이 같이 변경합니다.

그래서 클라이언트가 Etag 값이 부여된 자원을 캐시할 때 캐시 신선도를 검사하기 위해서 서버에게 Etag 값과 일치하는 자원이 있냐고 물어보면 변경 상태를 인지할 수 있습니다. 이 때 사용하는 헤더는 'If-None-Match'입니다.

ex)
서버가 If-None-Match 헤더가 포함된 요청 메세지를 수신합니다.

응답 유형은 날짜 기반과 동일합니다.

🌱 쿠키

클라이언트 측에 저장되는 데이터입니다. 상태를 유지하지 않는 HTTP의 특성을 보완하기 위해 만들어졌습니다. 서버가 클라이언트의 상태를 알 수 있게끔 하는 특별한 데이터입니다.

쿠키에 담기는 정보는 <이름, 값>의 형태를 가지고 추가로 적용 범위, 만료 기간 등의 속성이 포함됩니다. 서버에서 쿠키를 생성해서 클라이언트로 전송하면 클라이언트가 저장해 두었다가 이후에 동일한 서버에서 보내는 요청 메세지에 쿠키를 포함하여 전송합니다. 쿠키의 정보를 보고 서버는 요청이 같은 클라이언트에서 왔는지 로그인 상태인지 판별합니다.

서버의 응답 메세지
Set-Cookie: 이름 값; 속성1; 속성2

클라이언트의 요청 메세지
Cookie: 이름=값; 이름=값;

쿠키는 브라우저에 저장합니다. 서버에서 같은 도메인이라도 경로별 쿠키를 구분하여 사용할 수 있도록
응답 메세지에 경로를 명시하여 쿠키 정보를 활용합니다. 또한 유효기간을 설정하는 태그를 뒤에 붙여서 명시할 수 있습니다.

단점

쿠키는 보안이 약합니다. 외부 침입자에게 정보를 노출하거나 조작될 위험이 큽니다.
이를 보완하기 위해 만들어진게 SecureHttpOnly입니다.

Secure는 HTTPS 프로토콜이 사용되는 경우에만 쿠키를 전송할 수 있도록 세팅하는 속성입니다.
HttpOnly는 HTTP 송수신을 통해서만 쿠키를 이용하도록 제한하는 속성입니다.
쿠키는 자바스크립트 언어를 통해서 접근이 가능하여 침입자가 자바스크립트를 이용해서 중간에 쿠키를 가로채어 정보를 탈취할 수 있습니다. 그래서 이러한 접근을 막는 속성이 HttpOnly입니다.

실제로 개발 환경에서는 액세스 토큰, 리프레시 토큰같이 로그인 후 발급받는 중요한 보안 요소들은 로컬 스토리지와 쿠키에 나누어서 저장합니다.

🌱 콘텐츠 협상과 표현

같은 URI에 대해 가장 적합한 '자원의 형태'를 제공하는 메커니즘입니다.
같은 URI로 식별 가능한 html 문서라도 영어로 요청하면 영어로 제공하고 한국어로 요청하면 한국어로 제공하는 것이 콘텐츠 협상입니다. 표현은 송수신 가능한 자원의 형태를 의미합니다.

콘텐츠 협상과 표현은 GET 메서드와 관련되어있습니다. GET 메서드의 공식 정의 '대상 자원에 대해 현재 선택된 표현의 전송을 요청한다.'

사용 예시

ex)

GET /index.html HTTP/1.1
Host: example.com
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Accept: text/html,application/xml;q=0.9,text/plain;q=0.6,*/*;q=0.5

콘텐츠 협상의 중요한 점은 선호도에 우선순위를 반영합니다. 언어는 한국어를 가장 선호하면서 영어도 받을 용의가 있다는 요청 메세지를 전송할 수 있습니다. 이 우선순위는 q값으로 표현합니다. 생략되었을 경우에는 1이고 범위는 0~1에 설정 가능합니다. 값이 클 수록 우선순위가 높음을 의미합니다.

profile
안녕하세요

0개의 댓글