HTTP 헤더1

Single Ko·2023년 4월 6일
0

http

목록 보기
8/15

본 자료는 김영한님의 강의 모든 개발자를 위한 HTTP에서 내용을 정리한것입니다.

HTTP 헤더의 용도

  • header-field(field-name): (OWS)field-value(OWS) (OWS:띄어쓰기 허용)
  • HTTP 전송에 필요한 모든 부가정보(메시지 바디의 내용, 메시지 바디 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보...)
  • 표준 헤더가 너무 많음 (https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)
  • 필요시 임의의 헤더 추가 가능 (helloworld: hihi)

RFC2616(과거) <--폐기됨

General 헤더 : 메시지 전체에 적용되는 정보. (ex : connection:close)
Request 헤더 : 요청 정보 (ex : User-Agent: Mozilla/5.0)
Response 헤더 : 응답 정보 (ex: Server:Apache)
Entity 헤더: 엔티티 바디 정보 (ex: Content-Tpye:text/html, Content-Length:342)

  • 메시지 본문(Message Body)는 엔티티 본문(Entity Body)을 전달하는데 사용.
  • 엔티티 본문은 요청이나 응답에서 전달할 실제 데이터
  • 엔티티 헤더는 엔티티 본문의 데이터를 해석할 수 있는 정보 제공 : 데이터 유형, 길이등...

RFC723X...

엔티티(Entity) => 표현(Representation)
Representation = representation Metadata + Representation Data
표현 = 표현 메타데이터 + 표현 데이터

  • 메시지 본문(message body)를 통해 표현(Representation) 데이터 전달.
  • 메시지 본문 = 페이로드(payload)
  • 표현은 요청이나 응답에서 전달할 실제 데이터
  • 표현 헤더는 표현 데이터를 해석할 수 있는 정보 제공: 데이터 유형, 길이 등등
  • 참고: 표현 헤더는 표현 메타데이터와, 페이로드를 구분해야하지만, 생략

표현

  • Content-type : 표현 데이터의 형식
  • Content-Encoding : 표현 데이터의 압축 방식
  • Content-Language : 표현 데이터의 자연 언어
  • Content-Length: 표헌 데이터의 길이

표현 헤더는 전송, 응답 둘다 사용

Content-type

  • 데이터의 형식 설명
    미디어 타입, 문자 인코딩
  • text/html;charset=utf-8 , application/json, image/png ...

Content-Encoding

  • 표현 데이터를 압축하기 위해 사용
  • 데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가
  • 데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축 해제

Content-Language

  • 표현 데이터의 자연 언어를 표현
  • ko , en, en-US

Content-Length

  • 표현 데이터의 길이
  • 바이트 단위
  • Transfer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안됨.

콘텐츠 협상(Contents Negotiations)

클라이언트가 선호하는 표현 요청.
협상 헤더는 요청시에만 사용.

  • Accept : 클라이언트가 선호하는 미디어 타입 전달
  • Accept-Charset : 클라이언트가 선호하는 문자 인코딩
  • Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
  • Accept-Language : 클라이언트가 선호하는 자연 언어

Accept-Language로 보는 협상과 우선순위.

  클라이언트의 요청
  GET/event 
  Accept-Language:ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
 
  서버 - 1.독일어, 2.영어
  한국어가 없는 상황이기에 다음 우선순위인 영어로 언어를 보낸다.
  

Quality Values(q) 사용
0~1, 클수록 우선순위가 높고 낮을수록 우선순위 밀림.

GET /event
Accept: text/*, text/plain, text/plain;format=flowed, */*

구체적인 것이 우선이다. : 상세하게 적을수록 우선순위가 높고 포괄적일 수록 우선순위가 낮아진다.
1. text/plain;format=flowed
2. text/plain
3. text/*
4. */*

전송 방식 설명

  • 단순 전송 : Content-Length , 컨텐츠에 대한 길이를 알 수 있을때 사용.

  • 압축 전송 : Content-Encoding을 넣어줘야됨 ex)gzip...

  • 분할 전송 : Transfer-Encoding, 용량이 커서 분할해서 오는대로 바로바로 전송하는 것.(Content-Length를 보내면 안됨. 예측이 안됨.)

  • 범위 전송 : Range, Content-Range, 다운 받다 끊겼을때, 다시 요청할 시 범위를 통해 받음.

일반 정보

  • From : 유저 에이전트의 이메일 정보. 잘 사용되지는 않음. 검색 엔진 같은 곳에서 , 주로 사용.

    • Refere : 이전 웹 페이지 주소. 현재 요청된 페이지의 이전 페이지.(매우 많이 사용. 이전 페이지로 돌아가려면 refere가 있어야됨.). 유입 경로 분석 가능. 요청에서 사용. 재미있는 사실은 referer은 referrer의 오타이다.
  • User-Agent : 유저 에이전트 애플리케이션 정보 (웹 브라우저 정보 등..), 통계 정보. 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능. 요청에서 사용.

  • Server : 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보. =>중간에 여러 프록시 서버를 거친다. 그런 서버들을 빼고 진짜 나의 표현 데이터를 만들어 주는 서버. (응답에서 사용)

  • Date : 메시지가 발생한 날짜와 시간. 응답에서 사용(응답에서 사용)

특별한 정보

  • Host : 요청한 호스트 정보(도메인), 필수, 하나의 서버가 여러 도메인을 처리해야 할 떄. 하나의 IP주소에 여러 도메인이 적용되어 있을 때.

    • 가상호스트를 통해 여러 도메인을 한번에 처리할 수 있는 서버. 실제 애플리케이션이 여러개 구동될 수 있다.
    • 호스트가 없으면 요청을 구분 할 수가 없다.
    • IP로 따지면 포트와도 비슷한것이라 볼 수 있음.

  • Location

    • 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동
      (리다이렉트)
    • 201 (Created): Location 값은 요청에 의해 생성된 리소스 URI
    • 3xx (Redirection): Location 값은 요청을 자동으로 리디렉션하기 위한 대상 리소스를
      가리킴
  • Allow

    • 허용 가능한 HTTP 메서드
    • 405(Method Not Allowed)에서 응답에 포함해야함.
      ex) Allow : GET,HEAD,PUT
  • Retry-After

    • 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간.
    • 503 Status일때 서비스가 언제까지 불능인지 알려줄 수 있음.
      ex) Retry-After: Fri, 31 Dec 1999 23:59:59 GMT (날짜 표기)
      Retry-After: 120 (초단위 표기)

인증

  • Authorization : 클라이언트 인증 정보를 서버에 전달. => 인증 방법에 따라 Authorization에 들어가는 값은 달라진다.
    ex) Basic xxxxxxxxxxxxxxxxxxx
  • WWW-Authenticate : 리소스 접근시 필요한 인증 방법 정의. 401 응답과 함께 사용.
    ex ) WWW-Authenticate: Newauth realm="apps",type=1,title="Login to\"apps\"", Basic realm="simple"

쿠키

  • Set-Cookie : 서버에서 클라이언트로 쿠키 전달(응답)

  • Cookie : 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 전달.

    왜 쿠키를 쓰는 걸까?

    HTTP는 무상태(stateless) 프로토콜이다. 계속해서 user=홍길동을 넘겨주지 않는다면 '홍길동'이라는 유저를 못알아 본다. -> 모든 요청에 사용자 정보 포함을 하면 알 수 있다.

    => 문제가 있다는게 느껴진다. 보안에 취약, 개발이 힘듬.

    쿠키 저장소에 user=홍길동을 저장 시켜 놓는다면?

GET/welcome HTTP/1.1
Cookie: user=홍길동

웹 브라우저(클라이언트)는 cookie에서 user 정보를 꺼내서 서버에 전달 할 수 있고, 이렇게 된다면 서버는 user를 계속 알아 볼 수 있다.

모든 요청에 쿠키 정보 자동 포함.

쿠키

ex) set-cookie:sessionId=abcde1234; expires=Sat,26-Dec-2023 00:00:00 GMT;path=/;domain=.google.com;Secure

이런 식으로 쿠키가 온다. 쿠키의 주사용처

  • 사용자 로그인 세션 관리
  • 광고 정보 트래킹
  • 쿠키 정보는 항상 서버에 전송됨
    • 네트워크 트래픽 추가 유발
    • 최소한의 정보만 사용(세션 id, 인증 토큰)
    • 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지(localStorage) 사용.
    • 보안에 민감한 데이터는 저장하면 안됨!!(ex: 주민번호, 신용카드 번호 등등..)

1. 생명 주기

 Expires, max-age

Set-Cookie: expires=Sat,26-Dec-2023 00:00:00 GMT;
- 만료일이 되면 쿠키 삭제

Set-Cookie: max-age=3600(3600초)
- 0이나 음수를 지정하면 쿠키 삭제

세션 쿠키 : 만료 날짜를 새략하면 브라우저 종료시 까지만 유지
영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지

2. Domain

내가 지정한 쿠키가 아무 사이트에 들어갈때마다 막 생기면 큰일남.(다른 사이트의 세션아이디 등..)

  • 명시 - 명시한 문서 기준 도메인 + 서브 도메인 포함
    => domain=example.org
    - example.org는 물론이고 dev.example.org도 쿠키 접근

  • 생략 - 현재 문서 기준 도메인만 적용
    => example.org에서 쿠키를 생성하고 domain 지정 생략
    - example.org에서만 쿠키 접근 가능 dev.example.org는 불가능

3. Path

  • path=/home

  • 이 경로를 포함한 하위 경로 페이지만 쿠키 접근.

  • 일반적으로 path=/ 루트로 지정

    ex) path=/home 지정 , /home(o), /home/level1(o), /home/level1/level2(o) , /hello (x)

4. 보안

 Secure, HttpOnly, SameSite
  • Secure

    • 쿠키는 http, https 구분 x. Secure를 적용시 https인 경우에만 전송.

    -HttpOnly

    • XSS 공격 방지
    • 자바스크립트에서 접근 불가(document.cookie) ->원래는 접근 가능
    • HTTP 전송에만 사용

    -SameSite (최신기능, 브라우저에서 지원하는 범위확인이 필요)

    • XSRF 공격 방지
    • 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송
profile
공부 정리 블로그

0개의 댓글