HTTP 헤더
HTTP 헤더 용도
HTTP 전송에 필요한 모든 부가정보
EX) 메시지 바디의 내용, 메시지 바디의 크기, 압축 , 인증, 요청 클라이언트 , 서버 정보
헤더 분류
General 헤더: 메시지 전체에 적용되는 정보 예) Connection: close
Request 헤더: 요청 정보 예) User-Agent: Mozilla/5.0
Response 헤더: 응답 정보 예) Server: Apache
Entity 헤더: 엔티티 바디 정보 예) Content-Type: text/html
HTTP BODY
HTTP/1.1 200 OK |
Content-Type: text/html;charset=UTF-8 Content-Length: 3423 |
<html> <body>...</body> </html> |
메시지 본문은 엔티티본문을 전달하는데 사용
엔티티본문은 요청이나 응답에서 전달할 실제 데이터
엔티티헤더는 엔티티본문의 데이터를 해석할 수 있는 정보 제공
RFC723x 변화
엔티티 -> 표현
표현 = 표현 메타데이터 + 표현 데이터
HTTP BODY
HTTP/1.1 200 OK |
Content-Type: text/html;charset=UTF-8 Content-Length: 3423 |
<html> <body>...</body> </html> |
메시지 본문을 통해 표현 데이터 전달
표현은 요청이나 응답에서 전달할 실제 데이터
표현 헤더는 표현 데이터를 해석할 수 있는 정보 제공
표현
Content-Type: 표현 데이터의 형식
Content-Encoding: 표현 데이터의 압축 방식
Content-Language: 표현 데이터의 자연 언어
Content-Length: 표현 데이터의 길이
Content-Type
미디어 타입, 문자 인코딩
ex) text/html; charset=utf-8
application/json
image/png
Content-Encoding
표현 데이터를 압축하기 위해 사용
데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가
데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축 해제
ex) gzip , deflate , identity
Content-Language
표현 데이터의 자연 언어를 표현
ex) ko , en , en-US
Content-Length
표현 데이터의 길이
바이트 단위
Transfer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안됨
협상
클라이언트가 선호하는 표현 요청
Accept : 클라이언트가 선호하는 미디어 타입 전달
Accept-Charset: 클라이언트가 선호하는 문자 인코딩
Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
Accept-Language: 클라이언트가 선호하는 자연 언어
협상과 우선순위
ex)
GET /event Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
0~1, 클수록 높은 우선순위
생략하면 1
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
1. ko-KR;q=1
2. ko;q=0.9
3. en-US;q=0.8
4. en:q=0.7
ex)
GET /event Accept: text/*, text/plain, text/plain;format=flowed, */*
구체적인 것이 우선한다.
1. text/plain;format=flowed
2. text/plain
전송 방식
단순전송
압축전송
분할전송
범위전송
단순 전송
압축 전송
분할 전송
범위 전송
일반 정보
From : 유저 에이전트의 이메일 정보
Referer: 이전 웹 페이지 주소
User-Agent: 유저 에이전트 애플리케이션 정보
Server: 요청을 처리하는 오리진 서버의 소프트웨어 정보
Date: 메시지가 생성된 날짜
From
일반적으로 잘 사용되지 않음
검색 엔진 같은곳에서 주로 사용
Referer
현재 요청된 페이지의 이전 웹 페이지 주소
Referer를 사용해서 유입 경로 분석 가능
User-Agent
클라이언트의 애플리케이션 정보
통계 정보
어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
Server
요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
응답에서 사용
Date
메시지가 발생한 날짜와 시간
응답에서 사용
특별한 정보
Host: 요청한 호스트 정보
Location: 페이지 리다이렉션
Allow: 허용 가능한 HTTP 메소드
Retry-After: 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
Host
ex)
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
요청에서 사용
하나의 서버가 여러 도메인을 처리해야 할 때
Location
페이지 리다이렉션
웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동
(리다이렉트)
Allow
허용 가능한 HTTP 메소드
405(Method Not Alowed) 에서 응답에 포함해야함
Allow: GET, HEAD, PUT
Retry-After
유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
503 (Service Unavailable): 서비스가 언제까지 불능인지 알려줄 수 있음
Retry-After: Fri, 31 Dec 1999 23:59:59 GMT (날짜 표기)
쿠키
Set-Cookie: 서버에서 클라이언트로 쿠키 전달
Cookie: 클라이언트가 서버에서 받은 쿠리를 저장하고, HTTP 요청시 서버로 전달
예) set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure
사용처)
사용자 로그인 세션 관리
광고 정보 트래킹
쿠키정보는 항상 서버에 전송됨
네트워크 트래픽 추가 유발
최소한의 정보만 사용(세션 id,인증 토큰)
보안에 민감한 데이터는 저장하면 안됨(주민번호, 신용카드 번호 등등)
쿠키 생명주기
Expires, max-age
Expires
만료일이 되면 쿠키 삭제
max-age
ex) max-age:3600 => 3600초
0이나 음수를 지정하면 쿠키 삭제
세션 쿠키: 만료날짜를 생략하면 브라우저 종료시 까지만 유지
영속 쿠키: 만료날짜를 입력하면 해당 날짜까지 유지
쿠키 도메인
예) domain=example.org
명시: 명시한 문서 기준 도메인 + 서브 도메인 포함 쿠키 생성
생략: 현재 문서 기준 도메인만 적용
쿠키 경로
예) path=/home
이 경로를 포함한 하위 경로 페이지만 쿠키 접근
일반적으로 path=/ 루트로 지정
쿠키 보안
Secure
쿠키는 http, https를 구분하지 않고 전송
Secure를 적용하면 https인 경우에만 전송
HttpOnly
XSS 공격 방지
자바스크립트에서 접근 불가
HTTP 전송에만 사용
SameSite
XSRF 공격 방지
요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송
캐시와 조건부 요청
캐시가 없을 때
데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.
브라우저 로딩 속도가 느리다.
캐시 적용
캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.
브라우저 로딩 속도가 매우 빠르다.
캐시 시간 초과
캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다.
검증 헤더와 조건부 요청1
캐시 유효 시간이 초과해서 서버에 다시 요청하면 다음 두 가지 상황이 나타난다.
1. 서버에서 기존 데이터를 변경함
2. 서버에서 기존 데이터를 변경하지 않음
검증 헤더 추가
검증 헤더와 조건부 요청
캐시 유효 시간이 초과해도, 서버의 데이터가 갱신되지 않으면 304 Not Modified + 헤더 메타 정보만 응답(바디X)
클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타 정보를 갱신
클라이언트는 캐시에 저장되어 있는 데이터 재활용
결과적으로 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드
검증 헤더와 조건부 요청2
검증 헤더
캐시 데이터와 서버 데이터가 같은지 검증하는 데이터
Last-Modified, ETag
조건부 요청 헤더
검증 헤더로 조건에 따른 분기
If-Modified-Since: Last-Modified 사용
If-None-Match: ETag 사용
조건이 만족하면 200 OK
조건이 만족하지 않으면 304 Not Modified
Last-Modified, If-Modified-Since 단점
1초 미만(0.x초) 단위로 캐시 조정이 불가능
날짜 기반의 로직 사용
데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 똑같은 경우
ETag , If-None-Match
ETag
캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
ex) ETag : "v1.0"
데이터가 변경되면 이 이름을 바꾸어서 변경함
ex) ETag = "aaaa" -> ETag = "bbbb"
ETag만 서버에 보내서 같으면 유지, 다르면 다시 받는다.
캐시 제어 로직을 서버에서 완전히 관리
클라이언트는 단순히 이 값을 서버에 제공
캐시와 조건부 요청 헤더
Cache-Control : 캐시 제어
Pragma: 캐시 제어(하위 호환)
Expires: 캐시 유효 기간(하위 호환)
Cache-Control
Cache-Control : max-age
캐시 유효 기간, 초 단위
Cache-Control: no-cache
데이터는 캐시해도 되지만, 항상 원서버에 검증하고 사용
Cache-Control: no-store
데이터에 민감한 정보가 있으므로 저장하면 안됨
Pragma
캐시 제어(하위 호환)
Expires
캐시 만료일 정확한 날짜로 지정
Cache-Control : max-age 권장
Cache-Control: max-age와 함께 사용하면 Expires는 무시
캐시 무효화
확실한 캐시 무효화 응답
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Cache-Control
캐시 지시어 - 확실한 캐시 무효화
Cache-Control: no-cache
데이터는 캐시해도 되지만, 항상 원서버에 검증하고 사용
Cache-Control: no-store
데이터에 민감한 정보가 있으므로 저장하면 안됨
Cache-Control: must-revalidate
캐시 만료후 최초 조회시 원 서버에 검증해야함
원 서버 접근 실패시 반드시 오류가 발생해야함 - 504(Gateway Timeout)
Pragma: no-cache
출처: https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
'HTTP' 카테고리의 다른 글
김영한 HTTP 웹 기본 지식 2일차 (0) | 2021.12.17 |
---|---|
김영한 HTTP 웹 기본 지식 1일차 (0) | 2021.12.15 |