728x90
HTTP 헤더
- HTTP 헤더는 HTTP 본문(body) 및 요청/응답에 대한 정보를 포함한다.
- 헤더 필드 = 헤더 명 : 필드 값
- 예) Host : www.google.com
- 헤더 명은 대소문자 구문이 없다.
🔍 HTTP 헤더 용도
- HTTP 전송에 필요한 모든 부가 정보를 담고있다.
- 예) 메시지 바디 내용, 메시지 바디 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보.. 등등
- 필요시 임의의 헤더를 추가할 수 있다.
🔍 HTTP 표현 헤더
- 표현 = 표현 메타 데이터 + 표현 데이터
- Representation = Representation Metadata + Representation Data
- 과거에는 엔티티(Entity) 용어를 사용했으나 지금은 표현(Representation) 용어를 사용한다.
💡 HTTP 바디
- 메시지 본문(message body)을 통해 표현 데이터를 전달한다.
- 메시지 본문 = 페이로드(payload)
- 표현은 요청이나 응답에서 전달할 실제 데이터를 의미한다.
- 표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공한다.
- 데이터 유형(html, json), 데이터 길이, 압축 정보 등등
- 참고로 표현헤더는 표현 메타 데이터와 페이로드 메시지를 구분해야 한다.
💡 표현 헤더 종류
- Content-Type : 표현 데이터의 형식
- Content-Encoding : 표현 데이터의 압축 방식
- Content-Language : 표현 데이터의 자연 언어
- Content-Length : 표현 데이터의 길이
- 표현 헤더는 전송, 응답 둘다 사용된다.
✔ Contexnt-Type
- 표현 데이터의 형식 설명
- 미디어 타입, 문자 인코딩
- 예)
- text/html; chaeset=utf-8
- application/json
- image/png
✔ Content-Encoding
- 표현 데이터 인코딩
- 표현 데이터를 압축하기 위해 사용한다.
- 데이터를 전달하는 곳에서 압축후 인코딩 헤더를 추가한다.
- 데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축을 해제한다.
- 예)
- gzip
- deflate
- identity
- 압축 없이 그대로 전송
✔Content-Language
- 표현 데이터의 자연 언어를 의미한다.
- 예)
- ko
- en
- en-US
✔Content-Length
- 표현 데이터(바이트 단위)의 길이를 의미한다.
- Transefer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안된다.
- 전송 코딩안에 Content-Length가 이미 포함되어 있기 때문이다.
🔍 협상 헤더 (Content Negotiation)
- 클라이언트가 선호하는 표현 요청
- 협상 헤더는 요청시에만 사용한다.
- Accept : 클라이언트가 선호하는 미디어 타입 전달
- Accept-Charset : 클라이언트가 선호하는 문자 인코딩
- Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
- Accept-Language : 클라이언트가 선호하는 자연 언어
✔ Accecpt-Language 적용 전
✔ Accecpt-Language 적용 후
💡 협상과 우선순위1 - Quality Values(q) 값 사용
- 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
💡 협상과 우선순위2 - 구체적일수록 우선순위가 높다.
- 1. text/palin;format=flowed
- 2. text/plain
- 3. text/*
- 4. */*
💡 협상과 우선순위3 - 구체적인 것을 기준으로 미디어 타입을 맞춘다.
- Accept : text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5
우선순위 | Media Type | Quality |
1 | text/html;level=1 | 1 |
2 | text/html | 0.7 |
3 | text/plain | 0.3 |
4 | image/jpeg | 0.5 |
5 | text/html;level=2 | 0.4 |
6 | text/html;level=3 | 0.7 |
🔍 전송 방식
- 단순 전송
- 압축 전송
- 분할 전송
- 범위 전송
💡 단순 전송
- Content-Length를 통해 데이터의 길이를 명시하여 한 번에 보내고, 한 번에 받는다.
- Content-Length를 알 수 있을 때 사용한다.
💡 압축 전송
- 단순 전송과 비슷하지만, Content-Encoding을 통해 압축 방식을 헤더에 명시하고 본문에 압축된 메시지를 응답으로서 웹 브라우저에게 보낸다.
💡 분할 전송
- Content-Length 없이 Transfer-Encoding:chunked를 명시하여 분할하여 보낸다.
- 분할 전송시 헤더에 Content-Length가 존재하면 안된다.
- 마지막 메시지의 \r\n은 전송의 끝을 알리는 용도다.
💡 범위전송
- 클라이언트가 특정 범위를 지정해서 요청을 보내면 서버에서 해당 범위만큼 응답이 온다.
🔍 일반 정보를 제공하는 헤더 (정보성 헤더)
- Form : 유저 에이전트의 이메일 정보
- Referer : 이전 웹 페이지 주소
- User-Agent : 유저 에이전트 애플리케이션 정보
- Server : 요청을 처리하는 오리진 서버의 소프트웨어 정보
- Date : 메시지가 생성된 날짜
💡 Form
- 유저 에이전트의 이메일 정보
- 검색 엔진 곳에서 주로 사용된다.
- 요청에서 사용한다.
- 일반적으로 잘 사용되지 않는다.
💡 Referer
- 현재 요청된 페이지의 이전 웹 페이지 주소
- A → B로 페이지를 이동하는 경우 B를 요청할 때 Referer:A 정보를 헤더에 포함해서 요청한다.
- Referer를 사용해서 유입 경로를 분석할 수 있다.
- 요청에서 사용한다.
- 자주 쓰인다.
- 참고 : referer 단어는 referrer의 오타다. 하지만 그냥 그대로 쓰인다.
💡 User-Agent
- 유저 에이전트란, 클라이언트 애플리케이션 정보(웹 브라우저 정보)다.
- 통계 정보를 알 수 있다.
- 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능하다.
- 요청에서 사용한다.
- 예) user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
💡 Server
- 요청을 처리하는 ORIGIN(오리진) 서버의 소프트웨어 정보를 담고 있다.
- ORIGIN 서버란, 클라이언트 요청의 최종 도착지이며, HTTP 응답을 보내주는 서버
- 응답에서 사용한다.
- 예)
- Server : Apache/2.2.22(Debian)
- Server : nginx
💡 Date
- 메시지가 발생한 날짜와 시간을 담고 있다.
- 예) Date : Tue, 15 Nov 1994 08:12:31 GMT
- 응답에서 사용한다.
🔍 특별한 정보를 제공하는 헤더
- Host : 요청한 호스트 정보(도메인)
- Location : 페이지 리다이렉션
- Allow : 허용 가능한 HTTP 메서드
- Retry-After : 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
💡 Host
- 요청한 호스트 정보(도메인)를 담고 있다.
- 헤더에서 필수로 존재해야한다.
- 요청에서 사용한다.
- 하나의 서버가 여러 도메인을 처리할 때 도메인을 구분하기 위해서 사용한다.
- 하나의 IP 주소에서 여러 도메인이 적용되어 있을 때 도메인을 구분하기 위해서 사용한다.
💡 Location
- 페이지를 리다이렉션할 때 이동할 주소로 쓰인다.
- 웹 브라우저는 3xx 상태코드의 응답결과에 Location 헤더가 있으면 Location 위치로 자동 이동(리다이렉트)한다.
- 3xx 상태코드에서 Location 값은 요청을 자동으로 리다이렉션하기 위한 대상 리소스를 의미한다.
- 201(Created) 응답 결과에 Location 값이 헤더에 존재하면 요청에 의해 생성된 리소스 URI로 이동한다.
💡 Allow
- 허용 가능한 HTTP 메서드 정보를 담고 있다.
- 405(Method Not Allowed) 상태코드의 응답에 포함되어 있어야 한다.
- 예) Allow : GET, HEAD, PUT
- 잘 쓰이지는 않는다.
💡 Retry-After
- 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간을 담고있다.
- 503(Service Unavailable) 상태코드의 응답에 포함되어 있어야 한다.
- 예)
- Retry-After: Fri, 31 Dec 1999 23:59:59 GMT (날짜로 표기)
- Retry-After: 120 (초 단위로 표기)
🔍 인증
- Authorization : 클라이언트 인증 정보를 서버에 전달
- WWW-Authenticate : 리소스 접근시 필요한 인증 방법 정의
💡 Authorization
- 클라이언트 인증 정보를 서버에 전달한다.
- 예) Authorization: Basic xxxxxxxxxxxx
💡 WWW-Authenticate
- 리소스 접근시 필요한 인증 방법이 정의되어 있다.
- 401(Unauthorized) 상태 코드의 응답과 함께 사용된다.
- 예) WWW-Authenticate: Newauth realm="apps", type=1, title="Login to \"apps\"", Basic realm="simple"
🔍 쿠키
- 쿠키란 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각을 의미한다.
- 쿠키를 사용할 때 2가지 헤더를 사용한다.
- Set-Cookie : 서버가 클라이언트로 쿠키를 전달한다. (응답)
- Cookie : 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달한다.
💡 쿠키 특징
- 쿠키는 한개에 4KB까지 저장 가능하며, 최대 300개까지 저장할 수 있는 텍스트 파일이다.
- 쿠키는 클라이언트에 저장된다.
- 쿠키에는 이름, 값, 만료날짜, 경로 정보등이 들어있다.
- 기본적으로 쿠키는 웹 브라우저가 종료되면 삭제된다. (만료 날짜를 지정하면 만료일이 되야 삭제된다.)
- 웹 브라우저에 해당 서버의 쿠키 정보가 있으면 HTTP 요청(HTTP 헤더의 Cookie)에 무조건 담아 보낸다.
💡 쿠키 작동
- 로그인 이후 웹 브라우저는 자동으로 요청을 보낼때 마다 쿠키를 조회해서 쿠키 정보를 보낸다.
- 로그인 성공시 서버는 클라이언트한테 쿠키를 직접 주기보단 세션 키를 만들어서 서버의 데이터베이스에 저장하고, 세션 값을 클라이언트에 반환을 해준다. 그러면 클라이언트는 서버에 요청을 할 때 세션 id를 보낸다.
💡 쿠키 사용 이유
- 필수적인 쿠키
- 필수적인 쿠키는 페이지 탐색, 웹 사이트의 보얀 영역 접속, 그리고 검색을 포함한 웹사이트의 기본적인 기능의 활성화를 목적으로 사용되고 있다. 웹 사이트는 필수적인 쿠키 없이 최적화된 기능 수행이 불가능하므로, 쿠키는 이용자의 별도 동의 없이 활성화 되고 있다.
- 기능 쿠키
- 기능 쿠키는 웹 사이트가 접속자의 지역 및 언어 등 웹 사이트의 형태 및 외관에 영향을 줄 수 있는 접속자 설정을 저장하도록 허용하며, 접속자 설정에 따라 웹 사이트가 작동하도록 도움을 준다.
- 성능 쿠키
- 성능 쿠키는 정보의 익명 수집 및 보고를 통해 웹 사이트 운영자가 방문자와 웹사이트 사이의 상호작용을 이해하는데 도움을 준다. 유저와의 상화관계에 대한 통계자료를 제공함으로써 웹 사이트 운영자가 더욱 최적화된 웹 사이트를 개발하는데 기여한다.
- 마케팅 쿠키
- 마케팅 쿠키는 유저의 웹 사이트 방문 내역을 추적하며, 쿠키 제공자가 접속자의 경향 및 웹 사이트 이용 패턴을 파악한다. 그래서 유저에게 관련성 높은 광고나 제품을 제공하는데 기여한다.
💡 쿠키 정보
- 예) set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure
- 사용처
- 사용자 로그인 세션 관리
- 광고 정보 트래킹
- 쿠키 정보는 항상 서버에 전송된다.
- 네트워크의 추가 트래픽을 유발할 수 있다.
- 최소한의 정보만 사용해야한다. (세션id, 인증 토큰)
- 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지(localStorage, sessionStorage)에 참고할 것
- 주의
- 보안에 민감한 데이터는 저장하면 안된다. (주민번호, 신용카드 번호 등등)
💡 쿠키 생명 주기
- 예)
- Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
- 만료일이 되면 쿠키가 삭제된다.
- 만료일은 GMT 시간 기준으로 설정할 것
- Set-Cookie: max-age=3600 (3600초)
- 0이나 음수를 지정하면 쿠키가 삭제된다.
- 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시까지만 유지된다.
- 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지된다.
- Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
💡 쿠키 도메인
- 명시 : 명시한 문서 기준 도메인 + 서브 도메인 포함
- 예) domain=example.org
- domain=example.org에서 쿠키가 생성된다.
- example.org와 dev.example.org 등 서브 도메인에서도 쿠키 접근이 가능하다.
- 생략 : 현재 문서 기준 도메인만 적용된다.
- example.org에서 쿠키를 생성하고 domain 지정을 생략한다.
- example.org에서만 쿠키 접근 가능
- dev.example.org 등 서브 도메인에서는 쿠키 미접근
💡 쿠키 경로 - Path
- 예) path=/home
- 이 경로를 포함한 하위 경로 페이지만 쿠키 접근 가능
- 일반적으로 path=/ 루트로 지정한다.
- 예)
- path=/home 지정
- /home → 쿠키 접근 가능
- /home/level1 → 쿠키 접근 가능
- /home/level1/level2 → 쿠키 접근 가능
- /hello → 쿠키 접근 불가능
💡 쿠키 보안
- Secure
- 쿠키는 http, https를 구분하지 않고 전송한다.
- 그러나 Secure를 적용하면 https인 경우에만 전송한다.
- HttpOnly
- XSS 공격 방지
- 자바스크립트에서 접근이 불가능하다. (documen.cookie)
- HTTP 전송에만 사용한다.
- SameSite
- XSRF 공격 방지
- 요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키를 전송한다.
💡 세션이란,
- 세션은 쿠키를 이용하는 하나의 방식이다.
- 세션이란, 통신을 하기 위해 서로 연결된 순간부터 통신을 마칠떄 까지의 기간을 의미한다.
- HTTP 세션이란, 클라이언트가 서버와 연결된 순간부터 웹 브라우저가 닫아 서버와의 HTTP 통신을 끝낼떄까지의 기간이다.
- 세션 방식은 서버에 세션에 대한 정보(세션 상태, 클라이언트 상태, 세션 데이터 등)를 저장해놓고 세션 쿠키(고유한 세션 ID값)를 클라이언트에게 주어 서버가 클라이언트를 식별할 수 있도록 하는 방식이다.
✔ 세션 특징
- 따로 용량 제한이 없다. (서버 능력에 따라 다르다.)
- 서버에 세션 객체를 생성하며, 각 클라이언트 마다 고유한 세션 ID값을 부여한다.
- 쿠키를 사용하여 세션 ID값을 클라리언트에 보낸다.
- 웹 브라우저가 종료되면 세션 쿠기는 삭제된다.
✔ 세션 작동 방식
- 클라이언트가 서버에 요청을 보내면 서버에서는 요청 헤더에서 쿠키(Cookie)를 확인하고 세션 ID가 있는지 확인한다.
- 요청에 세션 ID가 없다면 서버에서 세션 ID를 생성하고 응답을 보낼 때 쿠키에 세션 ID를 담아 보낸다. (서버에서 가장 먼저 세션 객체를 생성하여 정보를 저장한다.)
- 클라이언트는 응답에서 받은 세션 쿠키(세션 ID값)를 저장해두고, 매번 해당 서버에 요청을 보낼 때마다 세션 쿠기를 함께 보내서 자신이 누구인지 인증한다.
- 세션 쿠키는 브라우저가 종료되면 삭제된다.
✔ 쿠키와 세션의 관계
- 쿠키는 클라이언트(웹 브라우저)에 정보를 저장하고, 세션은 서버에 정보를 저장한다.
- 쿠키와 세션은 서로 반대되는 개념처럼 보일 수 있으나 결국 세션은 쿠키를 이용하는 하나의 방식이다.
- 쿠키와 세션은 방식의 차이일뿐 반대 개념이 아니다.
- 쿠키는 stateless(무상태)한 HTTP 통신에서 클라이언트에게 정보(표시)를 주어 해당 클라이언트를 식별하기 위해 만들어졌다.
- 하지만 클라이언트에 저장된다는 쿠키의 특징은 보안에 있어서 치명적인 단점이다.
- 그래서 세션이라는 개념을 통해 중요한 정보는 서버에서 관리하고 클라이언트에게는 세션 쿠키(세션 ID)를 주어 식별이 가능하도록 한 것이다.
- 세션이란, 서버에 정보를 저장하고 쿠키를 통해 클라이언트를 식별하는 방식이다.
- 결론적으로 세션(통신을 시작하고 마칠 때까지의 기간)을 유지하는 위해 쿠키를 사용하는 것이다.
쿠키와 세션은 결국 목적(클라이언트에서 관리하냐, 서버에서 관리하냐)에 맞게 사용하면 된다.
클라이언트는 믿을 수 없기에 중요한 정보나 처리는 서버에서 다뤄야한다.
예를들어 쿠키는 쇼핑몰의 장바구니, 개인 설정(팝업창 표시 여부 등) 같은 것들에 많이 사용된다.
세션은 로그인 유지 등에 많이 사용된다.
👀 참고 자료
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
https://kobrekim.com/footer-ko-kr/cookie-policy-ko-kr/what-are-cookies-and-why-we-use-them-ko-kr/
https://noahlogs.tistory.com/38
728x90
'CS > HTTP' 카테고리의 다른 글
[HTTP] HTTP 헤더2 - 캐시와 조건부 요청 (0) | 2022.03.04 |
---|---|
[HTTP] HTTP 상태코드 (0) | 2022.03.01 |
[HTTP] HTTP 메서드 (0) | 2022.02.28 |
[HTTP] HTTP 기본 (0) | 2022.02.10 |
[HTTP] 인터넷 네트워크 (0) | 2022.02.09 |