알아볼 내용

  1. HTTP 헤더
  2. 캐시
  3. 쿠시
  4. 콘텐츠 협상과 표현

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 아키텍처가 x64
    • rv: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 메서드 목록 알려주는 헤더
Retry-After : 자원을 사용할 수 있는 날짜 혹은 시각 나타냄
Location : 클라이언트에게 자원의 위치를 알려 주기 위한 헤더
  • 주로 리다이렉션이 발생하거나 새로운 자원 생성되었을 때 사용
WWW-Authenticate
  • 상태 코드 401과 함께 사용
  • WWW-Authenticate: Basic : Basic 인증 요구
  • WWW-Authenticate: Basic realm="Access to engineering site", charset="UTF-8" : Basic 인증 요구 + 보연 영역 + 인증에 사용될 문자집합
    • realm : 보안이 적용될 영역 의미하며 영역이 달라지면 요구되는 권한도 달라질 수 있음
  • 인증 수행 과정
    1. 인증되지 않은 클라이언트가 서버에 GET 요청
    2. 서버는 상태 코드 401과 WWW-Authenticate 헤더 전달
    3. 클라이언트는 사용자로부터 인증 정보 (아이디, 비밀번호 등) 전달 받아 Authorization 헤더를 통해 GET 요청
    4. 서버는 인증 정보 확인해서 유효하면 상태 코드 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 : 예전 유닉스에서 쓰던 방식으로 호환성과 특허 문제로 거의 사용 X
    • Content-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

쿠키 : 서버에서 생성되어 클라이언트 측에 저장되는 데이터

  • HTTP의 Stateless 특성을 보완하기 위한 수단으로 이를 통해 서버가 클라이언트의 상태를 알 수 있음
    • 로그인 상태 유지 등…
    • <이름, 값> 쌍의 형태 + 적용 범위 및 만료 기간 등 속성 가짐

세션 인증 (Session Authentication)

  • 쿠키로 전달되는 대표적인 정보로 세션 아이디가 있음
  • 쿠키를 활용해 요청할 때마다 인증 거칠 필요 없음
  • 세션 인증 방식
    1. 클라이언트가 서버에서 인증 정보 전송
    2. 인증 정보가 올바르면, 서버는 세션 아이디를 생성해 클라이언트에 전송
    3. 서버는 생성한 세션 아이디를 데이터베이스 등에 저장
    4. 클라이언트는 추후 요청을 보낼 때 쿠키 내에 세션 아이디 포함해 전송
    5. 서버는 쿠키 속 세션 아이디와 저장된 세션 아이디 비교하여 클라이언트 식별
  • 서버는 쿠키 생성해서 클라이언트에 전송하고 클라이언트는 이를 저장해두었다가 동일한 서버에 보내는 요청 메시지에 쿠키를 포함해서 전송

    • 응답 메시지 : 서버가 생성해서 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
      ...
      
  • 쿠키의 보안 문제를 해결하기 위한 방법

    • 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 순으로 선호

Footnotes

  1. referrer이 맞지만, 초기 개발 당시 오타로 지금까지 사용

  2. Entity Tag (Etag). 자원의 버전을 식별하기 위한 정보

  3. 송수신 가능한 자원의 형태