알아볼 내용
- HTTP 헤더
- 캐시
- 쿠시
- 콘텐츠 협상과 표현
HTTP 헤더
- 헤더의 종류는 매우 많기 때문에 대표적인 것들 위주로 살펴봄
요청 시 활용되는 HTTP 헤더
Host : 요청을 보낼 호스트를 나타내는 헤더
- 주로 도메인 네임으로 명시
- 포트 번호 포함되어 있을 수 있음
- 예시 :
Host: info.cern.ch
User-Agent : HTTP 요청을 시작하는 클라이언트 측의 프로그램
- 운영체제, 브라우저 종류 및 버전, 렌더링 엔진 등 다양한 정보 포함
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
Mozilla/5.0
: Netscape/Mozilla의 버전 5.0의미 → 사실상 호환성 플래그로 ‘현대 브라우저’라는 관행적인 표식- Mozilla는 과거 ‘Netscape Navigator’라는 웹브라우저가 사용하던 코드명으로 당시에는 ‘Mozilla’ 브라우저에서만 고급 기능 보여줬음
- 다른 브라우저들도 호환성 확보를 위해 User-Agent에 Mozilla추가
Windows NT 10.0; Win64; x64;
: Window NT 기반 OS로 64비트 Windows 10 또는 그 이후 버전, CPU 아키텍처가 x64rv:109.0) Gecko/20100101
: 렌더링 엔진 Gecko의 내부 버전 109.0 의미 (20100101은 사실상 고정값)Firefox/109.0
: 사용 중인 브라우저의 버전
Referer1 : 클라이언트가 요청을 보낼 때 머무르고 있던 URL 명시
Referer: https://en.wikipedia.org/
: 클라이언트가 https::/en.wikipedia.org에서 요청을 보냈음
Authorization : 클라이언트의 인증 정보 담는 헤더
Authorization: <type> <credentials>
- 기본적인 type은 Basic이고 이때 credentials은 사용자 아이디와 비밀번호를 콜론으로 합친 뒤 Base64로 인코딩
- 아이디=minchul, 비밀번호=1234 → minchul:1234 → bWluY2h1bDoxMjM0
Authorization: Basic bWluY2h1bDoxMjM0
응답 시 활용되는 HTTP 헤더
Server : 요청을 처리하는 서버 측의 소프트웨어 관련 정보
Server: Apache/2.4.1 (Unix)
: Unix 운영체제에서 동작하는 아파치 HTTP 서버
Allow : 클라이언트에게 허용된 HTTP 메서드 목록 알려주는 헤더
- 상태 코드 405와 함께 사용
Retry-After : 자원을 사용할 수 있는 날짜 혹은 시각 나타냄
- 상태 코드 503과 함께 사용
Location : 클라이언트에게 자원의 위치를 알려 주기 위한 헤더
- 주로 리다이렉션이 발생하거나 새로운 자원 생성되었을 때 사용
WWW-Authenticate
- 상태 코드 401과 함께 사용
WWW-Authenticate: Basic
: Basic 인증 요구WWW-Authenticate: Basic realm="Access to engineering site", charset="UTF-8"
: Basic 인증 요구 + 보연 영역 + 인증에 사용될 문자집합- realm : 보안이 적용될 영역 의미하며 영역이 달라지면 요구되는 권한도 달라질 수 있음
- 인증 수행 과정
- 인증되지 않은 클라이언트가 서버에 GET 요청
- 서버는 상태 코드 401과 WWW-Authenticate 헤더 전달
- 클라이언트는 사용자로부터 인증 정보 (아이디, 비밀번호 등) 전달 받아 Authorization 헤더를 통해 GET 요청
- 서버는 인증 정보 확인해서 유효하면 상태 코드 200으로 응답, 인증되지 않았으면 401로 응답
요청과 응답 모두에서 활용되는 HTTP 헤더
Date : 메시지가 생성된 날짜와 시각에 관련된 정보를 담은 헤더
Date: Tue, 15 Nov 1994 08:12:31 GMT
Connection: 클라이언트의 요청과 응답 간의 연결 방식을 설정하는 헤더
Connection: keep-alive
: 대표적인 연결 방식Connection: close
: 서버나 클라이언트가 연결 종료하고 싶은 경우
Content-Length : 본문의 바이트 단위 크기
Content-Length: 100
Content-Type, Content-Language, Content-Encoding : 메시지 본문의 표현 방식을 설명하는 헤더
- 표현 헤더의 일종
- Content-Type : 메시지 본문에서 사용된 미디어 타입
Content-Type: text/html; charset=UTF-8
: 메시지 본문이 HTML 문서 형식이고 문자 인코딩으로 UTF-8을 사용
- Content-Language : 메시지 본문에 사용된 자연어, 언어 태그로 명시
Content-Language: ko
: 한국어Content-Language: ko-KR
: 한국에서 사용하는 한국어Content-Language: en-US
: 미국에서 사용하는 한국어Content-Language: en-UK
: 영국에서 사용하는 한국어
- Content-Encoding : 메시지 본문을 압축하거나 변환한 방식 명시
Content-Encoding: gzip
: 가장 널리 쓰이는 HTTP 압축 방식으로 빠르고 효율적Content-Encoding: compress
: 예전 유닉스에서 쓰던 방식으로 호환성과 특허 문제로 거의 사용 XContent-Encoding: deflate
: gzip보다 헤더가 더 짧고 약간 더 빠른 편Content-Encoding: br
: google에서 만든 최신 압축 알고리즘으로 gzip보다 압축률 높고 텍스테 강함. 주로 HTTPS 트래픽에서 사용Content-Encoding: deflate, gzip
: deflate로 압축 후 gzip으로 압축
캐시 : 불필요한 대역폭 낭비와 응답 지연을 방지하기 위해 정보의 사본을 임시로 저장하는 기술
- 동일한 요청에 대해 캐시된 데이터를 활용하여 빠르게 처리 가능
- 캐시의 종류
- 개인 전용 캐시 : 웹 브라우저에 저장
- 공용 캐시 : 클라이언트와 서버 사이의 중간 서버에 저장
- 캐시 신선도 (cache freshness) : 캐시된 사본 데이터가 최신 원본 데이터와 얼마나 유사한지를 나타내는 정보
- 기본적인 방법 : 캐시된 데이터에 유효 기간을 설정
- 응답 메시지에 Expires, Cache-Control 헤더 명시
Expires: Tue, 06 Feb 2024 12:00:00 GMT
Cache-Control: max-age=1200
- 캐시 신선도 재검사
- 날짜 기반 : 요청 메시지에 If-Modified-Since 헤더로 특정 시점 이후로 변경 있는 경우에만 새 자원 요청
- 자원 변경 : 상태 코드 200 (OK)과 함께 새로운 자원 반환
- 자원 변경 X : 상태 코드 304 (Not Modified). 응답 시 Last-Modified 헤더를 통해 마지막으로 수정된 시점 전달
- 자원 삭제 : 상태 코드 404 (Not Found)
- 엔티티 태그2 기반 : 요청 메시지에 If-None-Match 헤더로 특정 Etag 값을 갖는 자원이 변경된 경우에만 새 자원 요청
- 자원 변경 (Etag 변경) : 상태 코드 200 + 새로운 자원
- 자원 변경 X (Etag 동일) : 상태 코드 304
- 자원 삭제 : 상태 코드 404
- 날짜 기반 : 요청 메시지에 If-Modified-Since 헤더로 특정 시점 이후로 변경 있는 경우에만 새 자원 요청
쿠키 : 서버에서 생성되어 클라이언트 측에 저장되는 데이터
- HTTP의 Stateless 특성을 보완하기 위한 수단으로 이를 통해 서버가 클라이언트의 상태를 알 수 있음
- 로그인 상태 유지 등…
- <이름, 값> 쌍의 형태 + 적용 범위 및 만료 기간 등 속성 가짐
세션 인증 (Session Authentication)
- 쿠키로 전달되는 대표적인 정보로 세션 아이디가 있음
- 쿠키를 활용해 요청할 때마다 인증 거칠 필요 없음
- 세션 인증 방식
- 클라이언트가 서버에서 인증 정보 전송
- 인증 정보가 올바르면, 서버는 세션 아이디를 생성해 클라이언트에 전송
- 서버는 생성한 세션 아이디를 데이터베이스 등에 저장
- 클라이언트는 추후 요청을 보낼 때 쿠키 내에 세션 아이디 포함해 전송
- 서버는 쿠키 속 세션 아이디와 저장된 세션 아이디 비교하여 클라이언트 식별
-
서버는 쿠키 생성해서 클라이언트에 전송하고 클라이언트는 이를 저장해두었다가 동일한 서버에 보내는 요청 메시지에 쿠키를 포함해서 전송
- 응답 메시지 : 서버가 생성해서 Set-Cookie 헤더에 전달
- 여러 개를 동시에 전달할 수 있음
- domain 속성 : 사용 가능한 도메인 지정 가능
- path 속성 : 특정 하위 경로에서 사용할 쿠키 지정 가능
- Expires 속성 : 쿠키 만료 시점
- Max-Age 속성 : 초 단위 유효 기간
SET-Cookie: name=minchul domain=example.com path=/lectures Expires=Fri, Aug 2024 09:00:00 GMT Max-Age=2592000 SET-Cookie: ... ...
- 요청 메시지 : 클라이언트가 Cookie 헤더에 전달
Cookie: name=minchul; phone=100-100; message=Hello ...
- 응답 메시지 : 서버가 생성해서 Set-Cookie 헤더에 전달
-
쿠키의 보안 문제를 해결하기 위한 방법
- Secure : HTTPS 프로토콜을 사용하는 경우에만 쿠키를 전송
- HttpOnly : HTTP 송수신을 통해서만 쿠키를 이용하도록 제한
- 쿠키 데이터는 자바스크립트로 중간에 가로채거나 위변조 가능해서 이를 방지하는 속성
웹 스토리지 : 로컬 스토리지 + 세션 스토리지
- 웹 스토리지는 클라이언트가 저장하고 클라이언트의 상태를 추측할 수 있는 key-value 쌍 형태의 쿠키 이외의 정보
- 일반적으로 쿠키보다 더 큰 데이터 저장 가능
- 쿠키와 달리 서버로 자동 전송되지 않고 필요할 때 조회 가능
- 로컬 스토리지 : 별도로 삭제하지 않는 한 영구 저장
- 세션 스토리지 : 세션이 유지되는 동안 유지되는 정보
콘텐츠 협상과 표현
- 콘텐츠 협상 : 같은 URI에 대해 가장 적합한 ‘자원의 형태 (표현3)‘를 제공하는 메커니즘
- 영어로 요청하면 영어로 제공, 한국어로 요청하면 한국어로 제공…
- GET 메서드의 공식적인 정의 : 대상 자원에 대해 현재 선택된 표현의 전송을 요청
- 클라이언트가 선호하는 표현을 반영하기 위한 HTTP 헤더가 존재
- Accept: 선호하는 미디어
- Accept-Language : 선호하는 언어
- Accept-Charset : 선호하는 압축 방식
- Accept-Encoding : 선호하는 인코딩
- Quality value를 통해 선호도도 전달 가능
- 0~1 범위이며 생략된 경우 1
Accept-Langauge: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
: ko-KR > ko > en-US > en 순으로 선호