320x100
320x100

HTTP 메시지의 구조

: HTTP 헤더와 HTTP 바디로 구성

: 헤더에서는 본문(body) 및 요청/응답에 대한 정보를 포함

 > 본문에 대한 정보로는 본문 컨텐츠 길이 등의 정보

 > 요청/응답에 대한 정보는 General 정보 (요청시간, 요청에 사용된 브라우저 등)

 > 헤더의 프로퍼티는 이름-값 쌍으로 설정되며 콜론 ':' 으로 구분됨

 > 이름 : 값 (Name - Value)

 

 

 

 

HTTP 헤더의 유형

: HTTP 1.1의 헤더는 3가지로 구성됨

: 일반헤더 / 요청/응답헤더 / 엔티티 헤더

 

 

일반 헤더 (General Header)

: HTTP 통신에 대한 일반적인 정보를 포함

: Date / Connection / Cach-Control / Pragma / Trailer

 

- Date

: HTTP 메시지가 생성된 일시 (RFC1123에서 규정)

: Tue, 17 Nov 2022 21:50 KST

 

- Connection

: 클라이언트와 서버 간 연결에 대한 옵션

: Connection: close (현재 HTTP 메시지 직후에 TCP 접속을 끊는다)

: Connection: Keep-Alive (현재 TCP 접속을 유지한다)

 

- Cache-Control

: 쿠키 및 캐시 관련 옵션

: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control

 

- Pragma

: 1.0 헤더의 옵션으로, 1.1 버전의 Cache-Control 헤더와 동일한 역할 

 

- Trailer

: 메시지의 무결성 검사, 디지털 서명, 후처리 등 전송 동안 동적으로 생성 될 수 있는 메타 데이터를 정의

: chunk 메시지를 헤더 끝에 추가하여 사용

 

- Content-Type

: 해당 개체에 포함되는 미디어 타입 정보

: 컨텐츠의 타입 및 문자 인코딩 방식 등

: 타입 및 서브 타입 구조

 > application, audio, font, image, multipart 등의 타입

 > 서브타입은 각 타입별로 수많은 타입을 가짐

 

- Content-Language

: 해당 개체의 언어

 

- Content-Encoding

: 해당 개체의 데이터 압축 방식

: gzip, deflate 등

 

- Content-Length

: 전달되는 개체의 바이트 길이 또는 크기

: 응답 메시지의 Body의 길이 혹은 특정 개체의 길이를 지정

 

- Content-Location

: 해당 개체의 실제 위치

 

 

 

 

 

엔티티 헤더 (Entity Header)

: 실제 미시지 또는 전송중인 HTTP 본문에 대한 정보 (콘텐츠, 본문, 리소스)

: 컨텐츠 길이, 컨텐츠 언어, 인코딩, 만료 날짜 및 기타 정보

 

- Content-Dispotion (응답 메시지 헤더)

: 응답 메시지의 Body를 브라우저가 어떻게 표시할지에 대한 제어

 > inline인 경우 웹페이지 화면에 표시되고 attachment인 경우 다운로드

 > attachment의 경우 filename 옵션으로 파일명 까지 지정

 

- Content-Security-Policy (응답 메시지 헤더)

: 다른 외부 파일들을 불러오는 경우 차단할 소스와 불러올 소스를 명시

: XSS 공격에 대한 방어 가능

 > Content-Security-Policy: default-src https:

 

- Location (응답 메시지 헤더)

: 리소스가 redirect 된 때에 이동된 주소 또는 생성된 리소스 주소를 명시

: 300번대 응답이나 201 Created 응답 일때 어느 페이지로 이동할 지 제어

 

- LastModified (응답 메시지 헤더)

: 리소스를 마지막으로 갱신한 일시

 

- Transfer-Encoding (응답 메시지 헤더)

: chunked

: 동적으로 생성되어 Body의 길이를 모르는 경우에 조금씩 전송 가능도록 제어

: 각 chunk 마다 그 시작에 16진수 길이를 삽입하여 chunk 길이를 알려줌

 

 

 

 

요청 / 응답 헤더 (Request / Response Header)

: Request를 보낼때는 요청헤더

: Response를 보낼때는 응답헤더

: 요청한 URL 및 메소드, 요청 생성에 사용된 브라우저 및 기타 정보등의 데이터 포함

: 응답한 컨텐츠에 사용된 인코딩, 서버 소프트웨어 및 기타정보

 

 

 

 

HTTP 요청 헤더

- Host

: 요청하는 호스트에 대한 호스트명 및 포트 번호 (HTTP 1.1 이후 필수)

: Host 필드에 도메인명 및 호스트명 모두를 포함한 전체 URI 지정 필요

: 이에 따라 동일 IP 주소를 갖는 단일 서버에 여러 사이트 구축 가능

 

- User-Agent

: 클라이언트 소프트웨어 (브라우저/OS) 명칭 및 버전 정보

 

- From

: 클라이어트 사용자 메일 주소

: 주로 검색엔진 웹 로봇의 연락처 메일 주소를 나타냄

: 때로는 user-Agnet 항목에 두는 경우도 있음

 

- Cookie

: 서버에 의해 Set/Cookie로 클아이언트에게 설정된 쿠키 정보

 

- Referer

: 바로 직전에 머물렀던 웹 주소

 

- If-Modified-Since

: 지정한 일시 이후에 변경된 리소스를 취득 요청 가능

 

- Authentication

: 인증 토큰 (JWT/Bearer 토큰 등)을 서버로 보낼 때 사용하는 헤더

: 토큰의 종류 + 실제 토큰문자 형식

 

- Origin

: 서버로 POST 요청을 보낼 때 요청이 어느 주소에서 시작 되었는지 표시

: 여기서 요청을 보낸 주소와 실제 받는 주소가 다를 경우 CORS 에러 발생

: 응답 헤더의 Access-Control-Allow-Origin 관련

 

- Accept

: HTTP 메시지 Body의 속성 또는 내용 협상용 항목

: 클라이언트 자신이 원하는 미디어 타입 및 우선순위 표기

 

- Accept-Charset

: 클라이언트가 원하는 문자 집합

 

- Accept-Encoding

: 클라이언트가 원하는 문자 인코딩 방식

 

- Accept-Language

: 클라이언트가 원하는 언어 

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0
https://gmlwjd9405.github.io/2019/01/28/http-header-types.html

 

 

 

 

 

HTTP 응답 헤더

: 특정 유형의 HTTP 요청이나 HTTP 헤더를 수신 했을 때의 응답하는 헤더

 

- Server

: 서버 소프트웨어 정보

 

- Accept-Range

: 서버의 허용 범위

 

- Set-Cookie

: 서버측에서 클라이언트에게 세션 쿠키 정보를 설정 (RFC 2965)

 

- Expires

: 리소스의 유효 기간

: 응답 컨텐츠가 언제까지 만료되는지 설정

: Cahce-Control의 max-age가 있는 경우 해당 옵션은 무시됨

 

- Age

: max-age 시간 내에서 캐시 응답이 얼마나 흘렀는지 초단위로 표시

 

- ETag

: HTTP 컨텐츠가 바뀌었는지 검사

 

- Proxy-Authenticate

: 프록시에 대한 인증 정보

 

- Allow

: 해당 엔티티에 대해 서버 측에서 지원 가능한 HTTP 메소드의 리스트

: 때로는 HTTP 요청 메시지의 OPTIONS에 대한 응답용 항목으로도 사용

 

- Access-Control-Allow-Origin

: 요청을 보내는 프론트 주소와 백엔드 주소가 다를 경우 CORS 에러가 발생하는데,

  서버에서 이 헤더에 프론트 주소를 적어주어야 에러가 발생하지 않음

: 프로토콜, 서브 도메인, 도메인, 포트 중 하나만 달라도 오류 발생

: 값을 *로 지정할 경우 보안이 취약해짐

: 유사한 헤더들

 > Access-Control-Request-Method

 > Access-Control-Request-Headers

 > Access-Control-Allow-Methods

 > Access-Control-Allow-Headers

200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
X-Backend-Server: developer2.webapp.scl3.mozilla.com
X-Cache-Info: not cacheable; meta data too large
X-kuma-revision: 1085259
x-frame-options: DENY
https://gmlwjd9405.github.io/2019/01/28/http-header-types.html

 

 

 

 

 

CORS (Cross-Origin-Resource Sharing)

- 배경

: 처음 전송되는 리소스의 도메인과 다른 도메인으로 부터 리소스가 요청될 경우

  해당 리소스는 cross-origin HTTP 요청에 의해 요청됨

: 보안 상의 이유로 브라우저들은 스크립트 내에서 초기화 되는 cross-origin HTTP 요청을 제한

 

- 개념

: 웹 서버에게 보안 cross-domain 데이터 전송을 활성화 하는 cross-domain 접근 제어권을 부여

 

- 과정

: CORS 요청 시에는 미리 OPTIONS 주소로 서버가 CORS를 허용하는지 물어봄

: 이떄 Access-Control-Request-Method로 실제로 보내고자 하는 메서드를 알리고

  Access-Control-Request-Headers로 실제 보내고자 하는 헤더들을 알림

: Allow 항목들은 Request에 대응되는 것으로 서버가 허용하는 메서드와 헤더를 응답하는데 사용

: Request랑 Allow가 일치하면 CORS 요청이 이루어짐

 

 

 

 

 

 

Caching 관련 헤더

- Cache-Control

: 주로 응답 헤더로 사용하지만, 클라이언트 - 중개 서버 - 서버 구조일 경우

  중개 서버의 캐시를 가져오지 않도록 하기 위해서는 요청 헤더에 이 헤더를 추가해야함

 

- Expires

: 캐시의 유효기간

: Cache-Control에 max-age 옵션이 있는 경우 무시

 

- Age

: max-age 시간 내에서 얼마나 흘렀는지 캐시 응답의 시간을 초 단위로 표기

 

- ETag

: HTTP 컨텐츠가 바뀌었는지 검사

: 같은 주소의 자원이라도 컨텐츠가 달라졌다면 ETag가 다름

: 이 헤더 값이 변경 될 경우 캐시를 지우고 변경된 컨텐츠를 받음

 

- If-None-Match

: 서버에 ETag가 달라졌는지 검사 요청

: ETag가 다를 경우에만 새로운 컨텐츠를 받음

: ETag가 같을 경우 서버는 304 Not Modified를 응답

 

 

 

 

 

Cookie 관련 헤더

- Cooke

: 서버에 의해 Set-Cookie로 클라이언트에게 설정된 쿠키 정보

: 서버는 이 쿠키 헤더를 파싱하여 사용

: CSRF 공격을 막기 위해 반드시 서버는 쿠키가 제대로 된 상황에서 온 것인지 확인 필요

 

- Set-Cookie

: 서버 측에서 클라이언트에게 세션 쿠키 정보를 설정할 때 사용하는 항목 (RFC 2965)

: Expires

 > 쿠키 만료 날짜

: Max-Age

 > 쿠키의 수명 (Expires 무시)

: Secure

 > https에서만 쿠키가 전송됨

: HttpOnly

 > 자바스크립트에서 쿠키에 접근할 수 없도록 설정

 > XSS 요청을 막기위해 활성화를 권유

: Domain

 > 도메인이 일치하는 요청에서만 쿠키가 전송됨

: Path

 > 해당 path와 일치하는 요청에서만 쿠키가 전송됨

 

 

 

 

 

 

캐시, 쿠키, 세션의 차이

 - 캐시 (웹 캐시)

: 서버와 클라이언트간 통신 시 자주 사용되는 데이터를 미리 저장하여 

  다음 연결 시 빠르게 연결되도록 하는 캐시 데이터

 

- 쿠키

: 웹 상에서의 상태 정보를 클라이언트 (브라우저)에 저장하여 

  서버 측에서 필요할 때마다 활용하기 위한 데이터

: HTTP 비연결과 무상태를 보완하기 위함

: 웹 브라우저에 서버측에 있는 상태 값을 저장할 수 있도록 하여 사용자에 대한 지속적인 상태 감시 및 참조

 

- 세션

: 일정 시간동안 같은 브라우저로부터 들어오는 요청을 하나의 상태로 보고 그 상태를 유지하는 기술

: 웹 브라우저를 통해 서버에 접속한 이후로 부터 브라우저를 종료할 때 까지 유지되는 상태

: 연결을 유지하여 동적인 활용 가능

 

 

 

 

 

 

Refference

 

[정보] HTTP 구조 - 헤더(Header)와 본문(Body)

하이퍼 텍스트 전송 프로토콜(HTTP, Hyper Text Transport Protocol) 통신을 사용하면 클라이언트와 서버간에 두 가지 유형의 메시지 (HTTP 요청 및 HTTP 응답)를 전송할 수 있다. 클라이언트/브라우저가 요청

blueyikim.tistory.com

 

[Network] HTTP 헤더의 종류 및 항목 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

300x250
728x90