HTTP 웹 기본 - 07. HTTP 헤더 (일반 헤더)
HTTP 헤더 (일반 헤더)
형식
- field-name: OWS(띄어쓰기 허용) field-value OWS(띄어쓰기 허용)
- field-name 대소문자 구분 X
용도
- HTTP 전송에 필요한 모든 부가 정보
- ex) 메세지 바디 내용 & 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보 등등
- 표준 헤더가 너무 많음
- 필요시 임의의 헤더 추가 가능 위키피디아 참고
분류 - RFC2616 (과거)
- 1999년에 나옴
- General 헤더 : 메세지 전체에 적용되는 정보
- Request 헤더 : 요청 정보
- Response 헤더 : 응답 정보
- Entity 헤더: Entity Body(본문)의 데이터를 해석할 수 있는 정보 제공 (데이터 유형, 길이, 압축 정보 등)
- Entity Body : 요청이나 응답에서 전달할 실제 데이터
분류 - RFC7230 ~ 7235 (최신)
- 2014년에 나옴
- 엔티티 -> 표현(Representation)으로 바뀜
- Representation = Representation Metadata + Representation Data
- 메세지 Body(본문)을 통해 표현 데이터 전달
- 메세지 본문 = 페이로드(payload)
- 표현 헤더 : 표현 데이터를 해석할 수 있는 정보 제공 (데이터 유형, 길이, 압축 정보 등)
- 표현 : 요청이나 응답에서 전달할 실제 데이터
표현 헤더(Representation)
- 응답, 전송 둘 다에 사용
- 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를 사용하면 안됨
협상 (Contents Negotiation)
- 클라이언트가 선호하는 표현 요청 (요청 시에만 사용)
- 협상과 우선 순위
- 숫자의 경우 : 0 ~ 1 범위, 클수록 높은 우선 순위를 가짐 (default : 1)
- 문자의 경우 : 구체적인 것이 우선 [ ex)text/* < text/plain;format-flowed ]
- 구체적인 것을 기준으로 미디어 타입을 맞춤
- Accept : 클라이언트가 선호하는 미디어 타입 전달
- Accept-Charset : 클라이언트가 선호하는 문자 인코딩
- Accpet-Encoding : 클라이언트가 선호하는 압축 인코딩
- Accpet-Language : 클라이언트가 선호하는 자연 언어
전송 방식
- 단순 전송
- Content-Length
- 컨텐트의 길이를 알 수 있을 때 사용
- 압축 전송
- Content-Encoding
- 뜻 그대로 압축하여 전송
- 분할 전송
- Transfer-Encoding
- chunked : 데이터를 덩어리로 쪼개서 보냄
- Content-Length를 넣으면 안됨
- 범위 전송
- Range, Content-Range
- 원하는 범위를 명확히 지정해서 그만큼만 요청
일반 정보
- 정보의 성질이 헤더
- From : 유저 에이전트의 이메일 정보
- 일반적으로 잘 사용되지 않음
- 검색 엔진 같은 곳에서 사용
- 요청에서 사용
- Referer : 이전 웹 페이지 주소
- 매우 자주 사용된다 (referrer의 오타..)
- 현재 요청된 페이지의 이전 웹 페이지 주소
- A -> B로 이동하는 경우, B를 요청할 때 Referer: A를 포함해서 요청
- Referer를 통하여 유입 경로 분석 가능
- 요청에서 사용
- User-Agent : 유저 에이전트 애플리케이션의 정보
- 클라이언트의 애플리케이션 정보 (웹 브라우저 정보, OS정보 등)
- 통계 정보
- 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
- 요청에서 사용
- Server
- 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
- 응답에서 사용
- Date
- 메세지가 발생한 날짜와 시간
- 응답에서 사용
ORIGIN 서버
클라이언트가 HTTP 요청을 보낼 때, 여러 서버를 거쳐 최종적으로 받아주는, 끝단에 존재하는 서버
특별한 정보
- 특별한 정보를 제공하는 헤더
- Host
- 요청한 호스트 정보 (도메인)
- 필수
- 하나의 서버가 여러 도메인을 처리해야할 때
- 하나의 IP 주소에 여러 도메인이 적용되어 있을 때 (가상 호스트를 사용하여 가능)
- 요청에서 사용
- Location
- 페이지 리다이렉션
- 201(Created)에서 사용 : 요청에 의해 생성된 리소스 URI
- 300번대 에서 사용 : 요청을 자동으로 리다이렉션하기 위한 대상 리소스를 가리킴
- HTTP 상태 코드 300번대 참고
- Allow
- 허용 가능한 HTTP 메소드
- 405(Method Not Allowed)에서 응답에 포함해야함
- ex) Allow: GET, HEAD, PUT
- 많이 쓰이지 않음
- Retry-After
- 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
- 503 (Service Unavailable)에서 서비스가 언제까지 불능인지 알려줄 수 있음
- 날짜, 초단위 표기 가능
인증
- Authorization
- 클라이언트 인증 정보를 서버에 전달
- 들어가야 하는 value값은 인증 메커니즘마다 상이함
- WWW-Authenticate
- 리소스 접근시 필요한 인증 방법 정의
- 401 Unauthorized 응답과 함께 사용
쿠키
-
HTTP의 Stateless로 발생하는 문제를 해결하기 위해 사용
-
주 사용처 : 사용자 로그인 세션 관리, 광고 정보 트래킹
-
모든 요청에 쿠키 정보를 자동 포함 (항상 서버에 전송됨)
-
단점
- 네트워크 트래픽 추가적으로 유발
- 최소한의 정보만 사용 (세션 id, 인증 토큰) => 보안에 민감한 데이터는 저장 X
-
ex) 서버에 로그인을 할 때, 로그인 정보를 매번 요청에 포함시켜 보내지 않고 쿠키에 저장
- 서버
- 로그인 요청이 오면 Set-Cookie 헤더에 정보를 담아 클라이언트에 전달
- 클라이언트
- 웹브라우저의 쿠키 저장소 Set-Cookie 정보를 저장
- 로그인 이후, 서버에 요청을 보낼 때 마다 쿠키 저장소에서 해당 값을 찾음
- Cookie 헤더에 값을 넣어 서버로 전달
- 서버
-
Set-Cookie
- 서버에서 클라이언트로 쿠키 전달 (응답)
- 쿠키 저장소에 저장
- 생명 주기 - expires, max-age (0이나 음수 지정하면 쿠키 삭제)
- 세션 쿠키 - 만료 날짜를 생략 => 브라우저 종료시 까지만 쿠키 유지
- 영속 쿠키 - 만료 날짜를 입력 => 해당 날짜까지 쿠키 유지
- 도메인 - domain
- 명시한 문서 기준 도메인 + 서브 도메인 포함
- ex) domain=example.org
- 이 경우 domain=을 생략하면 서브 도메인엔 접근할 수 없음
- 경로 - path
- 경로를 포함한 하위 경로 페이지만 쿠키 접근
- 일반적으로 path=/ (루트)로 지정
- 보안
- Secure : https인 경우에만 쿠키 전송
- HttpOnly : XSS 공격 방지 => javascript에서 접근 불가
- SameStie : XSRF 공격 방지 => 요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키 전송
-
Cookie
- 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달
댓글남기기