본문 바로가기
강의정리/모든개발자를위한HTTP웹기본지식

HTTP 헤더 - 일반 헤더

by URMOO 2022. 8. 11.
반응형

본 내용은 인프런, 김영한님의 모든 개발자를 위한 HTTP 강의를 듣고 작성한 문서입니다.


용도

  • HTTP 전송에 필요한 모든 부가 정보 ex) 메시지 바디의 내용, 크기, 압축 인증, 서버 정보 등등..
  • 필요시 임의의 헤더도 추가 가능

RFC723x

  • 과거 엔티티라 표현했던 것을 표현 (Representation)으로 바꿈
  • 표현 = 표현 메타데이터 + 표현 데이터
  • Representation 의 R 은 REST의 R

HTTP BODY

여기서, Content-xxx 표현헤더

메시지 본문이 표현 데이터

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3000

<html>
...
</html>
  • 메시지 본문을 통해 표현 데이터를 전달한다.
  • 메시지 본문은 페이로드(payload)
  • 표현은 요청이나 응답에서 전달할 실제 데이터 (리소스?)
  • 표현 헤더는 표현 데이터를 해석할 수 있는 정보 제공(json, html, 길이.. 등등)

표현

  • Content-Type : 표현데이터의 형식(text, html, json.. 요즘엔 json이 대부분)
  • Content-Encoding: 표현 데이터의 압축 방식
  • Content-Language: 표현데이터의 자연언어 (한국어, 영어...)
  • Content-Length: 표현 데이터의 길이
  • 표현 헤더는 전송, 응답 둘다 사용한다

1. Content-Type

  • 미디어 타입, 문자 인코딩 등등 .. img도 표시

2. Content-Encoding

  • 표현데이터를 합축하기 위해 사용 ex) gzip, deflate..
  • 너무 큰 데이터를 한번에 전송할 때 사용,
  • 어떤 형식인지 알려줘야 그거에 맞게 압축을 풀 수 있다
  • 1/2 이상까지 압축을 해준다.

3. Content-Language

  • 표현 데이터의 자연언어를 표현..
  • 메시지 본문에 한글이냐 영어냐..

4. Content-Length

  • 바이트 단위로 표시
  • Transfer-Encoding (분할전송?) 할 떄는 사용 하면 안됨

협상 (콘텐츠 네고시에이션)

클라이언트가 원하는걸로 서버에 요청을 한다.

우선순위 실행이 가능하다.

단, 서버측에서 알고 있어야 한다. (이런 타입...? 들을..?)

협상 헤더는 요청(Request)시에만 사용 가능하다

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

Accept-Language?

accept-language 를 사용하기 전에는, 한국어 브라우저를 사용해도 서버측에서 기본이 영어로 되어 있으면 그냥 영어로 답이 왔다.

accept-language 를 적용하면, 브라우저에서 Accept-Language: ko 로 요청을 한다면 서버에서 한국어로 바로 보내준다.

그런데 만약에 서버가 기본 독일어, 그 외에는 영어밖에 없는데 한국브라우저를 사용한다면?

일단은 Accept-Language: ko 로 요청을 보내도 독일어로 오게 된다.. 기본이 독일어기 때문에..

만약, 한국어가 없을 때 두번째로 영어를 원한다면 우선순위를 지정해준다.

GET /event
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

이런식으로 지정해 주면 점수가 높은 것에 따라 언어를 보내주게 된다. (1 생략가능, 여기서는 KR이 1등)

만약 점수가 없으면.. 구체적으로 적은것을 우선한다.

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

이런 경우에는 가장 구체적인

1순위 text/plan;format=flowed

2순위 text/plan

3순위 text/*

4순위 */*

이렇게 된다.

전송방식

1. 단순전송

  • 단순하게 그냥 Content-Type, Content-Length 로 전송
  • 이미 바디에 길이가 어떻게 되는지 타입이 뭔지 알고 있음

2. 압축전송

  • Content-Encoding: gzip 이런 식으로 압축해서 전송
  • 바디의 용량이 줄어든다

3. 분할전송

  • HTTP/1.1 200 OK
    Content-Type: text/plan
    Transfer-Encoding chunked
    
    5
    hello
    5
    world
    0
    \r\n
    이런식으로 나눠서 전송 (5글자씩 잘라서 ... 양이 많으면..)
  • 한번에 보내기에 큰 경우 이런식으로 보낸다
  • 이 경우에는 Content-Length를 보내면 안된다 분할이라 전체 크기를 모름

4. 범위전송

  • 서버에서 데이터를 보내줬는데 중간에 끊겼을 경우 처음부터 다시 받는건 좀 별로니까 그 뒤로 range 정해서 받을 수도 있음
  • Content-Range: bytes 1001-2000/2000 이렇게 보내줌

일반정보

1. From

  • 유저 에이전트의 이메일 정보
  • 일반적으로 잘 사용되지 않음
  • 요청에서 사용

2. Referer

  • 현재 요청된 페이지의 이전 웹 페이지 주소
  • Referer를 사용해 유입 경보 준석 가능
  • 요청에서 사용

3. User-Agent

  • 클라이언트 애플리케이션 정보 (웹 브라우저 정보...등등)
  • 어떤 종류의 브라우저에서 장애가 발생하는지 파악가능
  • 요청에서 사용

4. Server

  • 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
  • 응답에서 사용

5. Date

  • 메시지가 발생한 날짜와 시간
  • 응답에서 사용

특별한 정보

1. HOST

  • 필수헤더
  • 요청한 호스트 정보(도메인)
  • 하나의 서버가 여러 도메인을 처리해야 할 때 사용
  • 하나의 IP 주소에 여러 도메인이 적용되어 있을 떄..
       이 때, Host 정보로 어디 사이트인지 알아낼 수 있다.
  • ex) 10.0.0.10 서버에 a 사이트, b 사이트 c 사이트가 올라가 있는데 /login 요청이 들어오면 어디 사이트의 요청인지 모름

2. Location

  • 페이지 리다이렉션 때 사용
  • 3xx 응답결과에 Location 헤더가 있으면 Location 위치로 자동 이동 (리다이렉트)
  • 201응답에서는 생성된 리소스의 URI

3. Allow

  • 허용 가능한 HTTP 메서드 405응답에 포함해야함
  • GET, HEAD, PUT

4. Retry-After

  • 503응답시에 서비스가 언제까지 불능인지 알려줄 수 있음
  • 날짜나 남은 초단위 시간으로 표기한다.

인증

1. Authorization

  • 클라이언트 인증 정보를 서버에 전달
  • Authorization: Basic xxxxxxxx

2. WWW-Authenticate

  • 리소스 접근시 필요한 인증 방법 정의
  • 401 Unauthorized 응답과 함께 사용
  • 401 에러가 날 때 함께 정보를 보내줘서 어떤 인증이 필요한지 알려줘야함

쿠키

만약 쿠키를 사용하지 않았을 경우?

로그인을 한 유저와 안한 유저를 구분하지 못함

이 유저를 구분하기 위해 항상 쿼리스트링으로 유저에 대한 정보를 보내줘야한다.

쿠키를 사용하면?

브라우저에서 로그인을 하면 서버측에서 헤더에 Set-Cookie: user=홍길동 과 같은 정보를 담아 응답을 보낸다.

그럼 브라우저에 쿠키가 자동저장되고, 그 다음 요청부터 Cookie: user=홍길동 을 항상 포함하여 보내게 된다.

쿠키의 사용처

  • 사용자 로그인 세션 관리
  • 광고 정보 트래킹

쿠키 정보는 항상 서버에 전송된다

  • 네트워크 트래픽 추가 유발
  • 세션 id나 토큰 등 최소한의 정보만 사용해서 쿠키를 저장해야한다
  • 서버에 전송하지 않고 싶은 정보들
  • 보안에 민감한 데이터는 저장하면 안됨

쿠키 - 생명주기

  • expires=... 날짜
  • 만료일이 되면 쿠기 삭제
  • Set-Cookie= max-age=3600 -> 3600 초 지정
  • 세션 쿠키 : 만료날짜를 생략하면 브라우저 종료시까지만 유지
  • 영속 쿠키 : 만료날짜를 입력하면 해당 날짜까지 유지

쿠키 - 도메인

  • 도메인을 지정해서 쿠키를 생성하면 명시한 도메인 + 서브도메인 도 쿠키 접근 간으
  • 도메인을 생략하면 만들어진 도메인에서만 쿠키 접근 가능

쿠키 - 경로

  • path=/home 이런식이라면
  • 이 경로를 포함한 하위 경로 페이지만 쿠키 접근 가능 (/home는 못감)

쿠키 - 보안

  • Secure
    • 쿠키는 http, https 를 구분하지 않고 전송
    • Secure를 지정하면 https인 경우에만 전송
  • HttpOnly
    • XSS 공격방지
    • 자바스크립에서 접근 불가
    • HTTP 전송에만 사용
  • SameSite
    • XSRF 공격방지
    • 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송
반응형

'강의정리 > 모든개발자를위한HTTP웹기본지식' 카테고리의 다른 글

HTTP 상태코드 요약  (0) 2022.08.11
클라이언트에서 서버로 데이터 전송  (0) 2022.08.11
HTTP API를 만들어 보자  (0) 2022.08.11
HTTP  (0) 2022.08.11
URI  (0) 2022.08.10

댓글