HTTP(HyperText Transfer Protocol) and HTTP Headers
- 클라이언트와 서버가 웹에서 이미지, 텍스트, 오디오 등의 파일과 같은 데이터를 주고받을 때 지켜야하는 규칙
- 무상태성(Stateless)
: 모든 HTTP 요청들은 현재 요청 직전에 어떤 요청들이 실행됐는지에 대한 정보가 없어, 독립적으로 실행된다.
즉, 트랜잭션이 종료되면 브라우저와 서버의 연결이 끊어진다.
HTTP 요청과 응답의 구조
- HTTP는 요청과 응답으로 이루어진다.
- 메시지는 시작(상태) 부분, 헤더(header), 빈 줄(blank line), 바디(body)로 구성된다.
- 시작 부분(요청) : HTTP 메서드, 요청 타겟, HTTP 버전
- 상태 부분(응답) : HTTP 버전, HTTP 응답 코드 및 메시지
- ★ Header : 프로토콜 기능 제공에 필요한 최소한의 정보가 담겨 있다.
- Blank line : 요청에 대한 모든 메타 정보가 전송되었음을 알린다.
- Body : 보내고자 하는 내용
HTTP Header
1. 공통 헤더 : 요청 및 응답 메시지 모두 사용 가능한 항목
① 일반 헤더(General Header)
- Date
- HTTP 메시지 생성일시 (RFC 1123에서 규정)
EX) Date: Sat, 2 Oct 2018 02:00:12 GMT - Connection
- 클라이언트와 서버 간 연결에 대한 옵션 설정(다소 모호한 복잡성 있음)
Ex) Connection: close
현재 HTTP 메시지 직후에 TCP 접속을 끊는다는 것을 알린다.
Ex) Connection: Keep-Alive
현재 TCP 커넥션을 유지한다. - Pragma
- HTTP/1.0 버전에서 Cache-Control 헤더의 역할을 하는 헤더
Ex) Pragma: no-cache - Trailer
- chunk 전송 인코딩을 사용할때 활용
- Ex) Trailer: Expires
Expires 헤더 필드가 메시지 바디 이후에 올 것임을 알려주고,
메시지 바디 다음에 Expires: Tue, 28 Sep 2004 23:59:59 GMT 가 등장
② 엔티티/개체 헤더(Entity Header) : HTTP 메시지 내 콘텐츠, 본문, 리소스 개체의 구체적인 미디어 타입 등을 설명
- Content-Type
- 콘텐츠의 타입(MIME)과 문자열 인코딩(UTF-8 등)을 명시할 수 있음
- 해당 개체에 포함되는 미디어 타입 정보
- 컨텐츠의 타입(MIME 미디어 타입) 및 문자 인코딩 방식(EUC-KR,UTF-8 등)을 지정한다.
- 타입 및 서브타입(type/subtype)으로 구성된다.
타입(type): 10개 정도 표준으로 지정됨(application, audio, font, image, multipart 등)
서브타입(subtype): 각 타입별로 수십에서 수백개 정도
- Ex) Content-Type: text/html; charset-latin-1
해당 개체가 html 텍스트 문서이고, iso-latin-1 문자 인코딩 방식으로 표현되는 것을 의미한다. - Content-Language
- 해당 개체와 가장 잘 어울리는 사용자 언어(자연언어) - Content-Encoding
- 해당 개체 데이터의 압축 방식
Ex) Content-Encoding: gzip, deflate
만일 압축이 시행되었다면 Content-Encoding 및 Content-Length 2개 항목을 토대로 압축 해제가 가능하다. - Content-Length
- 전달되는 해당 개체의 바이트 길이 또는 크기(10진수)
- 메시지 크기에 따라 자동으로 생성됨 - Content-Location
- 해당 개체의 실제 위치
③ Caching 관련 헤더
- Cache-Control
Ex) Cache-Control: no-store
아무것도 캐싱하지 않는다.
Ex) Cache-Control: no-cache
모든 캐시를 쓰기 전에 서버에 해당 캐시를 사용해도 되는지 확인한다.
Ex) Cache-Control: must-revalidate
만료된 캐시만 서버에 확인을 받도록 한다.
Ex) Cache-Control: public
공유 캐시(또는 중개 서버)에 저장해도 된다는 것을 의미한다.
Ex) Cache-Control: private
브라우저같은 특정 사용자 환경에만 저장한다.
Ex) Cache-Control: max-age
캐시 유효시간을 명시한다.
주로 응답 헤더로 사용하지만, “클라이언트 - 중개 서버 - 서버”의 구조에서 중개 서버의 캐시를 가져오지 않도록
하려면 클라이언트에서 요청 헤더에 이 헤더를 추가한다.
2. 요청 헤더 : 요청 메시지에서 사용 가능한 항목이며 가장 방대하다.
① 일반 헤더(General Header)
- Host
- 요청하는 호스트에 대한 호스트명 및 포트번호이며 HTTP/1.1 이후부터 필수 항목이다.
- Host 필드에 도메인명 및 호스트명 모두를 포함한 전체 URI(FQDN) 지정이 필요하다.
- 이에 따라 동일 IP 주소를 갖는 단일 서버에 여러 사이트를 구축할 수 있다. - User-Agent
- 클라이언트 소프트웨어(브라우저, OS) 명칭 및 버전 정보 - From
- 클라이언트 사용자 메일 주소
- 주로 검색엔진 웹 로봇의 연락처 메일 주소를 나타내며 이를 User-Agent 항목에 두는 경우도 있다. - Referer
- 바로 직전에 머물었던 웹 링크 주소 - If-Modified-Since
- 제시한 일시 이후로만 변경된 리소스를 취득 요청 - Authorization
- 인증 토큰(JWT/Bearer 토큰)을 서버로 보낼 때 사용하는 헤더
- “토큰의 종류(Basic, Bearer 등) + 실제 토큰 문자”를 전송 - Origin
- 서버로 POST 요청을 보낼 때, 요청이 어느 주소에서 시작되었는지 나타낸다.
- 여기서 요청을 보낸 주소와 받는 주소가 다르면 CORS 에러가 발생한다.
- 응답 헤더의 Access-Control-Allow-Origin와 관련 - Body의 속성 또는 내용 협상용 항목들
- Accept
클라이언트 자신이 원하는 미디어 타입 및 우선순위를 알린다.
텍스트(text/html,text/plain,…),이미지(image/jpeg,…) 등
Ex) Accept: */*
어떤 미디어 타입도 가능하다.
Ex) Accept: image/*
모든 이미지 유형이 가능하다.
- Accept-Charset
클라이언트 자신이 원하는 문자 집합
- Accept-Encoding
클라이언트 자신이 원하는 문자 인코딩 방식
- Accept-Language
클라이언트 자신이 원하는 가능한 언어
각각이 HTTP Entity Header 항목 중에 Content-Type, Content-Type charset-xxx, Content-Encoding,
Content-Language과 일대일로 대응된다.
② Cookies 관련 헤더
- Cookie
- 서버에 의해 Set-Cookie로 클라이언트에게 설정된 쿠키 정보
Ex) Cookie: attribute1=value1; attribute2=value2;
- 서버는 이 쿠키 헤더를 파싱해서 사용한다.
- CSRF 공격 같은 것을 막기 위해서 반드시 서버는 쿠키가 제대로 된 상황에서 온 것인지 확인하는 로직이 필요하다.
③ Caching 관련 헤더
- If-None-Match
- 서버에 ETag가 달라졌는지 검사를 요청한다.
- ETag가 다를 경우에만 컨텐츠를 새로 받는다.
- 만약 ETag가 같다면 서버는 304 Not Modified를 응답해서 캐시를 그대로 사용한다.
3. 응답 헤더 : 응답 메시지에서 사용 가능한 항목
① 일반 헤더(General Header)
- Server
- 서버 소프트웨어 정보 - Accept-Range
- Proxy-authenticate
- Allow
- 해당 엔터티에 대해 서버 측에서 지원 가능한 HTTP 메소드의 리스트를 나타낸다.
- 때론, HTTP 요청 메세지의 HTTP 메소드 OPTIONS에 대한 응답용 항목으로 사용된다.
- OPTIONS: 웹서버측 제공 HTTP 메소드에 대한 질의
Ex) Allow: GET,HEAD
405 Method Not Allowed 에러와 함께 웹 서버에서 제공 가능한 HTTP 메서드는 GET, HEAD 뿐임을 알린다. - Access-Control-Allow-Origin
- 요청을 보내는 프론트 주소와 받는 백엔드 주소가 다르면 CORS 에러가 발생
- 서버에서 이 헤더에 프론트 주소를 적어주어야 에러가 나지 않는다.
Ex) Access-Control-Allow-Origin: [URL]
프로토콜, 서브도메인, 도메인, 포트 중 하나만 달라도 CORS 에러가 난다.
Ex) Access-Control-Allow-Origin: *
만약 주소를 일일이 지정하기 싫다면 *으로 모든 주소에 CORS 요청을 허용되지만 그만큼 보안이 취약해진다.
- 유사한 헤더로 Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Headers 등이 있다.
- Request와 Allow에서 Method 단수 복수 주의
② Cookies 관련 헤더
- Set-Cookie
- 서버측에서 클라이언트에게 세션 쿠키 정보를 설정할 때 사용하는 항목 (RFC 2965에서 규정)
Ex) Set-Cookie: 속성이름(attribute)=속성값(value); 옵션들 형태로 다수 정보들이 설정됨
옵션들
Expires: 쿠키 만료 날짜 설정
Max-Age: 쿠키 수명 설정. Expires는 무시
Secure: https에서만 쿠키가 전송된다.
HttpOnly: 자바스크립트에서 쿠키에 접근할 수 없다, XSS 요청을 막으려면 활성화해두는 것이 좋다.
Domain: 도메인을 적어주면 도메인이 일치하는 요청에서만 쿠키가 전송된다.
가끔 도메인이 다른 쿠키들이 있는데, 이런 쿠키들은 써드 파티 쿠키로
클라이언트를 추적하고 있는 쿠키이다.
Path: 해당 path와 일치하는 요청에서만 쿠키가 전송된다.
Ex) Set-Cookie: zerocho=babo; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
쿠키는 XSS 공격과 CSRF 공격 등에 취약하기 때문에 HttpOnly 옵션을 켜두고,
쿠키를 사용하는 요청은 서버 단에서 검증하는 로직을 마련해두는 것이 좋다.
③ Caching 관련 헤더
- Expires
- 리소스가 지정된 일시까지 캐시로써 유효함을 나타낸다. 즉, 응답 컨텐츠가 언제 만료되는지를 나타낸다.
Ex) Expires: Thu, 26 Jul 2018 07:28:00 GMT
- Cache-Control과 별개로 응답에 Expires라는 헤더를 줄 수 있다.
- 단, Cache-Control의 max-age가 있는 경우 이 헤더는 무시 - Age
- 캐시 응답. max-age 시간 내에서 얼마나 흘렀는지 초 단위로 알려준다.
Ex) max-age= 3600을 설정한 경우, 1분 후 Age: 60이 캐시 응답 헤더에 포함된다. - ETag
- HTTP 컨텐츠가 바뀌었는지를 검사할 수 있는 태그
- 같은 주소의 자원이더라도 컨텐츠가 달라졌다면 ETag가 다르다.
- 같은 주소로 GET 메서드 수행 시 응답 Body의 내용이 동일하면 같은 ETag를 갖지만, 내용이 바뀌었다면 ETag 헤더 값이 변경된다.
- 이 헤더 값이 변경되었다면 캐시를 지우고 새로 변경된 컨텐츠를 받는다.
▷ 출처
https://gmlwjd9405.github.io/2019/01/28/http-header-types.html
https://jaejade.tistory.com/52
https://www3.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html
728x90
'Network' 카테고리의 다른 글
TCP/IP (0) | 2024.07.17 |
---|---|
Web Server vs WAS(Web Application Server) (0) | 2024.07.11 |
REST(Representational State Transfer) API (0) | 2024.07.08 |