[Network] 이번엔 HTTP header(헤더)

muz·2022년 1월 5일
0
post-thumbnail

stateless?

상태 없는 프로토콜이 사용자 로그인 여부를 아는 방법?

HTTP는 stateless 하다고 했다. 이는 HTTP 요청 시, 각각의 요청들은 서로 관련이 없음을 의미하는 것이다. 그렇다면 이런 상태가 없는 프로토콜에서는 어떻게 사용자가 로그인 되었는지를 알 수 있을까?

바로 cookiesessions을 이용하면 알 수 있다.

쿠키와 세션


client가 server에게 로그인을 요청하면, server가 client에게 로그인에 필요한 정보를 포함한 헤더를 보내준다. 이 헤더 안에는 여러가지 정보가 있지만, 그 중 로그인에 대한 정보는 Set-cookie안에 있다. 이렇게되면 현재 브라우저 client에만 쿠키가 있다.

🙄 cookie??
: 브라우저에서 잠시 정보(데이터)를 보관하는, 저장하는 저장소

만약 헤더에 쿠키가 포함되어있으면, 브라우저는 자동으로 쿠키에 저장한다. 이렇게 쿠키를 저장하고 있다가 다음에 request를 요청할 때 헤더에 동일한 쿠키를 넣어서 서버에게 보낸다.

cache-control


쿠키 외에도 server에서 client에게 정보를 보낼 때, cache-control에 해당 정보를 어느 기간동안 보관해야할지(캐싱해야할지)를 명시해서 보낼 수 있다. 그럼 브라우저는 자동으로 브라우저 저장소에 해당 데이터를 저장해두고, 해당 기간 내에 client가 server에 동일한 요청을 할 경우 저장된 데이터를 그대로 활용하는 것이다.

그래서 HTTP 헤더가 뭔데!

client와 server는 HTTP Header를 이용해 request 또는 response로 부가적인 정보를 전송한다. 개발자도구를 켜보면, 이렇게 헤더에 대한 정보를 볼 수 있다.

위의 사진에서 보이는 것처럼 이름:값의 형태로 이루어져있다.

헤더 안에는 표준적인 헤더 내용들(standard)이 있고, 우리가 직접 추가(custom)해서 넣을 수도 있다. 예전에 Custom을 쓸 때에는 x-auth이런 방식을 썼었으나, 12년도부터는 domain.key, domain-key 이런 식으로 쓰게끔 권고되어왔다. 바로 이렇게 말이다!

🙄 그럼 만들어쓰는 게 더 좋지 않겠어?
: 아니다. standard에 따라 브라우저가 동작하는 것이니, 만들어 쓰기보다는 표준화된 것을 쓰는 것이 더 좋다.

context에 따라 헤더 그룹핑하기

1. General header

: 요청과 응답 메시지 모두에서 사용되지만, body에서 최종적으로 전송되는 데이터(contents자체)와는 관련이 없는 헤더이다.

  • Date, Cache-Control, Connection

2. Request header

: HTTP 요청에서 사용되지만, 메시지의 컨텐츠와는 관련이 없는 HTTP헤더. fetch될 리소스client 자체에 대한 정보를 포함하는 헤더이다.
(요청에 나타나는 모든 헤더가 요청 헤더인것은 아니다. Content-Length헤더는 entity header이지만 종종 컨텍스트와 같은 요청 헤더라고 불리기도 한다.)

3. Response header

: 메시지의 컨텐츠와는 관련이 없으며, 위치 또는 서버 자체에 대한 정보(이름, 버전 등)처럼 응답에 대한 부가적인 정보를 갖는 헤더이다.
(응답에 나타나는 모든 헤더가 응답 헤더인것은 아니다. Content-Length헤더는 entity header이지만 보통 컨텍스트에서 응답 헤더로 불린다.)

4. Entity header

: content 길이나 MIME 타입처럼 Entity body에 대한 자세한 정보를 포함하는 헤더이다. Entiy 헤더가 요청이나 응답 헤더가 아님에도 불구하고, 종종 그렇게 불리기도 한다.

프록시의 처리 방법에 따라 그룹핑하기

1. 종단간 헤더

: 이러한 헤더는 반드시 메시지의 최종 수신자에게 전송되어야 한다. 중간 프록시는 반드시 종단 간 헤더를 수정되지 않은 상태로 재전송해야하며 캐시는 이를 반드시 저장해야한다.

2. 홉간 헤더

: 이러한 헤더는 단일 전송-레벨 연결에서만 의미가 있고, 프록시에의해 재전송되거나 캐시되어선 안된다. 홉간 헤더는 Connection 일반 헤더를 사용해 설정될 수도 있다.

자주 사용하는 HTTP 헤더 요약

인증

  • Authorization
    : 서버와 함께 유저 에이전트를 인증하기 위한 자격 증명을 포함한다.
  • Proxy-Authenticate (en-US)
    : 프록시 서버 뒤에 있는 리소스에 접근 시 사용되어야 하는 인증 메소드를 정의한다.
  • Proxy-Authorization (en-US)
    : 프록시 서버와 함께 유저 에이전트를 인증하기 위한 자격 증명을 포함한다.

캐싱

  • Age
    : 객체가 프록시 캐시에 있었던 초 단위의 시간을 의미한다.
  • Cache-Control
    : 요청과 응답 모두에서의 캐싱 메커니즘을 명시하는 지시문이다.
  • Clear-Site-Date (en-US)
    : 요청하는 웹사이트에 관련된 탐색 데이터(ex. 쿠키, 저장소, 캐시)를 제거한다.
  • Expires
    : 응답이 만료되었다고 고려되는 날짜/시간을 의미한다.

조건부

  • Last-Modified
    : 동일한 리소스의 여러 버전을 비교하는 데 사용되는 검사기로, 리소스의 마지막 수정 날짜를 의미한다. ETag보다 덜 정확하나 계산이 좀 더 쉬울 때가 있다.
  • ETag
    : 리소스의 버전을 식별하는 고유한 문자열 검사기이다.
  • If-Match (en-US)
    : 저장된 리소스가 주어진 ETags의 하나와 일치하는 경우에만, 요청을 조건부로 만들고 메소드를 적용한다.
  • If-None-Match (en-US)
    : 저장된 리소스가 주어진 ETags 모두와 일치하지 않는 경우에만, 요청을 조건부로 만들고 메소드를 적용한다. 캐시 업데이트 및 이미 존재하는 리소스를 다시 업로드하는 것을 방지하기 위해 쓰인다.
  • If-Modified-Since
    : 주어진 날짜 이후에 수정된 경우에만 요청을 조건부로 만들고 엔티티가 전송될 것을 기대한다. 캐시가 만료되었을 때에만 데이터를 전송하는 데에 사용된다.
  • If-Unmodified-Since (en-US)
    : 주어진 날짜 이후에 수정되지 않은 경우에만 요청을 조건부로 만들고 엔티티가 전송될 것을 기대한다.

연결관리

  • Connection
    : 현재 트랜잭션이 끝난 후, 네트워크 연결을 연린 상태로 둘지 여부를 제어한다.

컨텐츠 협상

  • Accept
    : 돌려줄 데이터 타입에 대해 서버에 알린다. (MIME 타입이다.)
  • Accept-Charset
    : 클라이언트가 이해할 수 있는 문자 집합에 대해 서버에 알린다.
  • Accept-Encoding
    : 인코딩 알고리즘에 대해 서버에 알린다.
  • Aeecpt-Language
    : 서버가 돌려주기로 예상된 언어에 대해 서버에 알린다.

쿠키

  • Cookie
    : Set-Cookie헤더와 함께 서버로부터 이전에 전송됐던 저장된 HTTP 쿠키를 포함한다.
  • Set-Cookie
    : 서버에서 유저 에이전트로 쿠키를 전송한다.

CORS

  • Access-Control-Allow-Origin
    : 응답이 공유될 수 있는지를 나타낸다.
  • Origin
    : Fetch가 시작된 위치를 나타낸다.

다운로드

  • Content-Disposition
    : 전송된 리소스가 한 줄로 표시되어야하거나, 다운로드처럼 처리되어야 하고 브라우저가 '다른 이름으로 저장' 창을 표시해야할 때에 대한 응답 헤더이다.

메시지 바디 정보

  • Content-Length
    : 수신자에게 전송된 entity 바디의 크기를 10진수 바이트 단위로 나타낸다.
  • Content-Type
    : 리소스의 미디어 타입을 나타낸다.
  • Content-Encoding
    : 압축 알고리즘을 명시하는 데 사용된다.

프록시

  • Forwarded
    : 프록시가 요청의 경로에 포함될 때 변경되거나 손실되는 프록시 서버의 클라이언트 측면에 대한 정보를 포함한다.

리다이렉트

  • Location
    : 페이지를 리다이렉트할 URL을 나타낸다.

요청 컨텍스트

  • From
    : 요청하는 유저 에이전트를 제어하는 사용자의 이메일 주소를 포함한다.
  • Host
    : 서버의 도메인명과 서버가 리스닝중인 TCP 포트번호를 명시한다.
  • Referer
    : 현재 페이지로 연결되는 링크가 있던 이전 웹 페이지의 주소이다.
  • User-Agent
    : 네트워크 프로토콜 피어가 요청하는 사용자 에이전트의 애플리케이션 타입, 운영체제, 소프트웨어 벤더 및 버전을 식별할 수 있는 특성 문자열을 포함한다.

응답 컨텍스트

  • Allow
    : 리소스에 의해 지원되는 HTTP 요청 메소드를 나열한다.
  • Server
    : 요청을 처리하기 위해 오리진 서버에 의해 사용되는 소프트웨어에 대한 정보를 포함한다.
profile
Life is what i make up it 💨

0개의 댓글