HTTP 헤더
JeongSeulho
2024년 12월 21일
준비중...
클립보드로 복사
표현 헤더
-
표현 데이터(BODY)의 내용, 형식, 크기, 압축 등 정보를 알려주는 헤더
-
요청, 응답 HTTP 메시지 모두에 사용
-
Content-Type : 표현 데이터의 형식
- 예시 :
text/html; charset=utf-8
,application/json
,image/jpeg
- 예시 :
-
Content-Encoding : 표현 데이터가 어떤 압축 형식으로 인코딩되었는지 알려주는 헤더
- 해당 헤더를 통해 압축 형식을 파악하여 압축 해제 가능
- 예시 :
gzip
,deflate
,identity
-
Content-Language : 표현 데이터의 자연 언어
- 예시 :
ko-KR
,en-US
- 예시 :
-
Content-Length : 표현 데이터의 길이를 바이트 단위로 알려주는 헤더
- 이 길이 만큼의 데이터가 오면 데이터 전송이 완료된 것으로 간주
- 단,
Transfer-Encoding
헤더가 있으면Content-Length
헤더를 사용하지 않음 - 예시 :
24
(바이트 단위)
협상 헤더
- 클라이언트가 선호하는 표현을 서버에게 알려주는 헤더
- 복수의 선호하는 것들을 알려주는 것이 가능
- 요청 메시지에서만 사용
- Accept : 클라이언트가 선호하는 미디어 타입
- Accept-Charset : 클라이언트가 선호하는 문자 인코딩
- Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
- Accept-Language : 클라이언트가 선호하는 자연 언어
Quality Values(q)를 사용한 우선순위
- 0~1 사이의 숫자로 표현, 높을수록 우선순위가 높음
- 생략 시 1로 간주
- 예시 :
Accept: ko-KR,en-US;q=0.7,en;q=0.3
- 아래와 같은 우선순위
ko-KR
: 1en-US
: 0.7en
: 0.3
구체적인 명시를 통한 우선순위
- 구체적인 명시를 통해 우선순위를 표현, 구체적인 것이 우선순위가 높음
- 예시 :
Accept: text/*, text/plain, text/plain;format=flowed, */*
- 아래와 같은 우선순위
text/plain;format=flowed
text/plain
text/*
: 0.6*/*
: 0.4
전송 방식에 따른 헤더
- 단순 전송
- 압축 전송
- 응답의 Content-Encoding 헤더로 압축 인코딩 방식을 알려줌
- 분할 전송
- 응답의
Transfer-Encoding : chunked
로 설정 - 이 경우
Content-Length
헤더는 사용하지 않음
- 응답의
- 범위 전송
- 중간에 데이터가 끊어지면 전체를 다시 요청하지 않고 필요한 부분만 요청
- 요청의
Range
헤더로 전송 특정 범위의 데이터만 요청(Range: bytes=100-200
) - 응답의
Content-Range
헤더로 전송 범위를 알려줌(Content-Range: bytes 100-200/1000
)
기타 정보 헤더
- Form : 요청한 유저의 이메일 정보
- 크롤링에서 크롤러에게 연락하거나 과도한 크롤링을 방지하기 위해 연락처를 제공
- Referer : 이전 웹 페이지 주소
- A => B로 이동하는 경우 B의 HTTP 요청에
Referer: A
헤더를 포함 - 유입 경로 분석
- A => B로 이동하는 경우 B의 HTTP 요청에
- User-Agent : 클라이언트의 애플리케이션(브라우저) 정보
- 서비스의 사용 브라우저 및 버전 정보 분석
- 어떤 종류의 브라우저에서 에러가 나는지 파악
- Server : 요청을 처리하는 마지막 서버의 소프트웨어 정보
- 프록시 서버, 캐시 서버 등 요청을 거쳐가는 여러 서버 중 최종 처리하는 마지막 서버의 소프트웨어 정보
- Date : 메시지가 발생한 날짜와 시간, 주로 응답에서만 사용
실제 HTTP 통신에 영향을 주는 헤더
- Host : 요청한 도메인 주소
- 요청에서 사용하는 필수 헤더
- 하나의 서버에서 여러 도메인을 처리하는 구조로 되어 있을 때 구분하기 위함
- Allow : 허용된 메서드를 알려주는 헤더
405 Method Not Allowed
응답에 포함 되는 헤더
- Retry-After : 유저가 다시 요청하기까지 기다려야 하는 시간
503 Service Unavailable
응답에 포함 되는 헤더- 얼마나 길게 점검하는지 등을 알려주는 것
인증 헤더
- Authorization : 인증 정보를 서버에게 전달
- 요청 메시지에서 사용
Authorization: <인증 타입> <인증 값>
과 같이 사용- 예시 :
Authorization: Basic 1234567890
,Authorization: Bearer 1234567890
- WWW-Authenticate : 리소스 접근에 필요한 인증 방법을 알려주는 헤더
401 Unauthorized
응답에 포함 되는 헤더
- Set-Cookie : 서버에서 클라이언트로 쿠키 전달하는 헤더
- 예시 :
Set-Cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2024 00:00:00 GMT; path=/; domain=.example.org; Secure
- 예시 :
캐시 헤더
cache-control
설정을 통해 캐시에 대한 설정을 할 수 있음
cache-control 헤더의 캐시 사용
- cache-control: max-age=60 : 60초간 이 응답을 캐시로 사용하라
- cache-control: no-cache : 캐시를 하되, 캐시가 만료되지 않아도 사용하기 전에 항상 Origin 서버에 검증을 해라 =>
304 Not Modified
이면 캐시 사용 - cache-control: public : public 캐시에 저장 가능
- public 캐시는 많은 사용자가 거치는 중간 프록시 서버의 캐시를 지칭
- cache-control: s-maxage=60 : 60초간 이 응답을 public 캐시로 사용하라(public 캐시 전용)
- cache-control: private : private 캐시에 저장 가능
- private 캐시는 특정 클라이언트의 캐시를 지칭(즉, 특정 사용자의 PC)
cache-control 헤더의 캐시 무효화
- cache-control: no-store : 민감한 정보, 캐시를 하지 않음
- cache-control: must-revalidate : 캐시가 만료되면 사용하기전에 Origin 서버에 검증을 해라 =>
304 Not Modified
이면 캐시 사용
no-cache vs must-revalidate
no-cache
는 프록시 서버가 Origin 서버와 통신 못한 경우 프록시 캐시를 반환하며200 OK
응답을 반환하기도 함must-revalidate
는 프록시 서버가 Origin 서버와 통신 못한 경우504 Gateway Timeout
응답 등 무조건 오류를 반환
검증 헤더와 조건부 요청
- 헤더를 사용하여 클라이언트의 캐싱된 데이터를 사용해도 될지 서버에서 알려주며
200 OK
응답을 반환하거나304 Not Modified
응답을 반환
날짜를 사용한 검증 헤더
- last-modified : 응답 데이터가 (서버에서) 마지막으로 수정된 시간, 응답 메시지에서 사용
- if-modified-since : 캐시 데이터가 서버에서 마지막으로 수정된 시간, 요청 메시지에서 사용
- 위 헤더를 사용하여 캐시를 검증하는 방법
- 요청하여 받은 데이터와
last-modified
,cache-control
정보를 저장(캐싱) - 다음 요청 시 캐시된 데이터가 있는데, 캐시가 만료되어 요청을 진행해야함
- 요청 메시지에
if-modified-since
헤더에 캐시의last-modified
정보를 전달 - 서버는
if-modified-since
헤더를 통해 클라이언트에 캐시된 데이터가 마지막으로 수정된 시간을 확인 - 만약 캐시된 데이터가 서버의 데이터와 동일하다면
304 Not Modified
응답을 반환하며 데이터를 전달하지 않음
- 요청하여 받은 데이터와
- 단점 : 캐싱이 가능함에도 캐싱하지 않는 상황 발생
- 데이터를 수정하여 날짜가 다르지만, 데이터 결과는 동일한 경우
- 실제 서비스에 관여하지 않는 변경이지만 수정하여 날짜가 달라지는 경우
ETag를 사용한 검증 헤더
- ETag : 캐시에서 데이터의 버전, 응답 메시지에서 사용
- if-none-match : 캐시 데이터의 버전, 요청 메시지에서 사용
- 위 날짜 로직과 동일하게 버전이 동일하면
304 Not Modified
응답을 반환하며 데이터를 전달하지 않음 - 날짜와 다르게 개발자가 캐싱할지 안할지 결정할 수 있음(배포에 맞춰서 ETag를 변경하는 등)