본문 바로가기

HTTP

김영한 HTTP 웹 기본 지식 3일차

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