Corgi 혼자 공부하는 네트워크 5-3 HTTP 헤더와 HTTP 기반 기술 공부 기록
본문 바로가기
개발자 일상/혼자 공부하는 네트워크

혼자 공부하는 네트워크 5-3 HTTP 헤더와 HTTP 기반 기술 공부 기록

by 짱아아빠 2024. 10. 7.
반응형

요청 시 활용되는 HTTP 헤더

  1. Host
    • 요청을 보낼 호스트를 나타내는 헤더로 도메인 네임으로 명시되며, 포트 번호가 포함될 수도 있습니다.
    • 예시: Host: www.example.com:80
  2. User-Agent
    • 웹 브라우저와 같이 HTTP 요청을 시작하는 클라이언트 측의 프로그램 정보를 담고 있습니다.
    • Mozilla 호환 여부, 운영체제, 아키텍처 정보, 렌더링 엔진 정보, 브라우저 및 버전 정보 등을 포함합니다.
    • 예시: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
  3. Referer
    • 요청을 보낼 때 현재 머무르고 있던 URL을 명시합니다.
    • 이를 통해 유입 경로를 파악할 수 있습니다.
    • 예시: Referer: https://www.google.com/
  4. Authorization
    • 클라이언트의 인증 정보를 담는 헤더로, 인증 타입과 인증을 위한 정보가 명시됩니다.
    • 기본적으로 Basic 타입의 인증을 사용하며, Base64로 인코딩됩니다.
    • 예시: Authorization: Basic dXNlcjpwYXNz
  5. Accept
    • 클라이언트가 처리할 수 있는 미디어 타입을 서버에 전달합니다.
    • 예시: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  6. Accept-Encoding
    • 클라이언트가 지원하는 콘텐츠 인코딩 방식을 서버에 전달합니다.
    • 예시: Accept-Encoding: gzip, deflate, br
  7. Accept-Language
    • 클라이언트가 선호하는 언어를 서버에 전달합니다.
    • 예시: Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
  8. Cookie
    • 클라이언트가 이전에 서버로부터 받은 쿠키를 서버에 전달합니다.
    • 예시: Cookie: sessionId=abc123; theme=light

응답 시 활용되는 HTTP 헤더

  1. Server
    • 요청을 처리하는 서버 측의 소프트웨어와 관련된 정보를 명시합니다. 예: Apache/2.4.1 (Unix)
  2. Allow
    • 클라이언트에게 허용된 HTTP 메서드 목록을 알려주기 위해 사용됩니다.
    • 예시: Allow: GET, POST, OPTIONS
  3. Retry-After
    • 자원을 사용할 수 있는 날짜 혹은 시각을 나타내며, 주로 503 에러와 함께 사용됩니다.
    • 예시: Retry-After: 120 (초 단위)
  4. Location
    • 클라이언트에게 자원의 위치를 알려주기 위해 사용되며, 주로 리다이렉션이 발생했을 때 사용됩니다.
    • 예시: Location: https://www.example.com/new-page
  5. WWW-Authenticate
    • 상태 코드 401과 함께 사용되는 헤더로, 인증 방식을 설명합니다.
    • 실제로는 이보다 더 많은 정보를 제공하기도 합니다. 예: Basic, 보안 영역, 문자 집합 등
    • 인증 과정:
      1. 인증되지 않은 클라이언트가 서버에 GET 요청 전송
      2. 서버는 401과 WWW-Authenticate 헤더를 통해 인증 방식을 알림
      3. 클라이언트는 인증 정보를 입력
      4. 인증 정보를 Base64로 인코딩한 값을 Authorization 헤더를 통해 GET 요청
      5. 서버는 인증 정보를 확인
      6. 인증이 유효하면 200, 아니면 401로 응답
  6. Set-Cookie
    • 서버가 클라이언트에 쿠키를 설정할 때 사용하는 헤더입니다.
    • 예시: Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure
  7. Content-Security-Policy (CSP)
    • 웹 페이지가 로드할 수 있는 리소스의 출처를 제어하여 XSS 공격 등을 방지합니다.
    • 예시: Content-Security-Policy: default-src 'self'; img-src https://*;
  8. Strict-Transport-Security (HSTS)
    • 클라이언트가 HTTPS를 통해서만 서버에 접속하도록 강제합니다.
    • 예시: Strict-Transport-Security: max-age=31536000; includeSubDomains

요청과 응답 모두에게 활용되는 HTTP 헤더

  1. Date
    • 메시지가 생성된 날짜와 시각에 관련된 정보를 담은 헤더입니다.
    • 예시: Date: Wed, 21 Oct 2023 07:28:00 GMT
  2. Connection
    • 요청과 응답 간의 연결 방식을 설정하는 헤더입니다.
    • 예시: Connection: keep-alive
  3. Content-Length
    • 본문의 바이트 단위 크기(길이)를 나타냅니다.
    • 예시: Content-Length: 348
  4. Content-Type, Content-Language, Content-Encoding
    • 전송하려는 메시지 본문의 표현 방식을 설정하는 헤더로, 표현 헤더의 일종입니다.
      • Content-Type: 미디어 타입을 담고 있으며, 문자 인코딩 정보를 포함할 수 있습니다.
        • 예시: Content-Type: text/html; charset=UTF-8
      • Content-Language: 자연어를 명시하며, en이나 ko 등과 같은 언어 코드를 포함합니다. 두 번째 서브 태그로 특정 국가를 의미하는 국가 코드가 명시될 수 있습니다.
        • 예시: Content-Language: en-US
      • Content-Encoding: 메시지 본문을 압축하거나 변환한 방식을 명시하며, 전송 속도를 개선하기 위해 사용됩니다. 대표적인 값으로 gzip, compress, deflate, br 등이 있습니다.
        • 예시: Content-Encoding: gzip
  5. Cache-Control
    • 캐시의 동작 방식을 제어합니다.
    • 예시: Cache-Control: no-cache, no-store, must-revalidate
  6. Pragma
    • HTTP/1.0 캐시 제어 헤더로, 주로 no-cache 값을 사용합니다.
    • 예시: Pragma: no-cache
  7. ETag
    • 특정 리소스의 버전을 식별하는 고유한 식별자입니다.
    • 예시: ETag: "686897696a7c876b7e"
  8. Last-Modified
    • 리소스가 마지막으로 수정된 날짜와 시각을 나타냅니다.
    • 예시: Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT

반응형

캐시

캐시는 원본 데이터의 사본을 임시로 저장하는 기술로, 캐시한다 또는 캐싱한다고 표현합니다. 캐시는 웹 성능 향상과 서버 부하 감소에 중요한 역할을 합니다.

  1. 개인 전용 캐시
    • 웹 브라우저에 저장되어 있는 캐시입니다.
    • 예: 브라우저가 방문한 웹 페이지의 이미지, CSS, JavaScript 파일 등을 저장하여 재방문 시 빠르게 로드합니다.
  2. 공용 캐시
    • 클라이언트와 서버 사이에 위치한 중간 서버(프록시 서버 등)에 저장되어 있는 캐시입니다.
    • 여러 사용자가 동일한 리소스를 요청할 때, 중간 서버가 캐시된 데이터를 제공하여 네트워크 대역폭과 서버 부하를 줄입니다.
  3. 캐시 신선도
    • 캐시된 사본 데이터가 얼마나 최신 원본 데이터와 유사한지를 나타냅니다.
    • 유효 기간 부여 방법:
      • Expires 헤더와 Cache-Control 헤더의 Max-Age 값을 사용할 수 있습니다.
        • 예시: Cache-Control: max-age=3600 (1시간)
      • 날짜를 기반으로 재검사하는 방식으로 If-Modified-Since 헤더를 사용합니다. 변경되면 200 코드, 변경되지 않으면 304, 삭제되었으면 404 코드로 응답을 받습니다. 변경 시점은 Last-Modified 헤더를 통해 알 수 있습니다.
      • 엔티티 태그를 사용하는 방법도 있습니다. 버전 값을 식별하는 ETag 값을 사용하며, If-None-Match 헤더를 통해 요청을 보냅니다. 변경되었으면 200, 변경되지 않으면 304, 삭제되었으면 404로 응답을 받습니다.
        • 예시: If-None-Match: "686897696a7c876b7e"
  4. 캐시 무효화 (Cache Invalidation)
    • 캐시된 데이터가 더 이상 유효하지 않다고 판단될 때 이를 제거하는 과정입니다.
    • 예: 컨텐츠 업데이트 시 ETag 또는 Last-Modified 값을 변경하여 캐시된 데이터가 갱신되도록 합니다.

쿠키

쿠키는 서버에서 생성되어 클라이언트 측에 저장되는 데이터로, 상태를 유지할 수 있게 하는 수단입니다. 이름과 값의 쌍 형태를 띠고 있으며, 적용 범위와 만료 기간 등 다양한 속성을 가질 수 있습니다.

  • 전달 방식:
    • 응답 메시지의 Set-Cookie 헤더와 요청 메시지의 Cookie 헤더를 통해 전달됩니다.
    • 예시:
      • 응답: Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure
      • 요청: Cookie: sessionId=abc123; theme=light
  • 도메인 및 경로 설정:
    • 각 도메인마다 사용되는 것이 정해져 있으며, 이를 Domain 속성으로 설정합니다.
    • 하위 경로를 사용할 때는 Path를 사용합니다.
    • 예시: Set-Cookie: userId=xyz; Domain=example.com; Path=/account
  • 주요 속성:
    • HttpOnly:
      • 쿠키의 위변조를 방지하기 위한 속성으로, JavaScript에서 쿠키에 접근하지 못하도록 설정합니다.
      • 예시: Set-Cookie: sessionId=abc123; HttpOnly
    • Secure:
      • HTTPS를 통해서만 쿠키를 전송하도록 설정하는 속성입니다.
      • 예시: Set-Cookie: sessionId=abc123; Secure
    • SameSite:
      • 크로스 사이트 요청 위조(CSRF) 공격을 방지하기 위해 쿠키가 전송될 때의 조건을 설정합니다.
      • 값: Strict, Lax, None
      • 예시: Set-Cookie: sessionId=abc123; SameSite=Strict
    • Expires 및 Max-Age:
      • 쿠키의 만료 시간을 설정합니다. Expires는 절대 시간, Max-Age는 상대 시간(초 단위)으로 설정합니다.
      • 예시: Set-Cookie: sessionId=abc123; Max-Age=3600 (1시간)

콘텐츠 협상과 표현

콘텐츠 협상과 표현은 클라이언트에게 가장 적합한 자원의 표현을 제공하는 메커니즘을 의미합니다. 클라이언트의 선호도에 따라 우선순위를 반영할 수 있습니다. 이를 통해 다양한 클라이언트 환경에 최적화된 콘텐츠를 제공할 수 있습니다.

  1. 미디어 타입 협상
    • 클라이언트가 Accept 헤더를 통해 지원하는 미디어 타입을 서버에 전달하면, 서버는 이에 맞는 콘텐츠를 제공합니다.
    • 예시: 클라이언트가 Accept: application/json을 보냈을 때, 서버는 JSON 형식의 응답을 보냅니다.
  2. 언어 협상
    • 클라이언트가 Accept-Language 헤더를 통해 선호하는 언어를 서버에 전달하면, 서버는 해당 언어로 콘텐츠를 제공합니다.
    • 예시: Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7일 때, 서버는 한국어 콘텐츠를 우선 제공하고 필요 시 영어로 제공할 수 있습니다.
  3. 인코딩 협상
    • 클라이언트가 Accept-Encoding 헤더를 통해 지원하는 인코딩 방식을 서버에 전달하면, 서버는 이를 활용해 콘텐츠를 압축하여 전송합니다.
    • 예시: Accept-Encoding: gzip, deflate, br일 때, 서버는 gzip으로 압축된 응답을 보낼 수 있습니다.
  4. 캐릭터 인코딩 협상
    • 클라이언트가 Accept-Charset 헤더를 통해 지원하는 문자 인코딩을 서버에 전달하면, 서버는 이에 맞게 콘텐츠를 인코딩합니다.
    • 예시: Accept-Charset: utf-8, iso-8859-1;q=0.5

 

 

추가로 

 

보안 관련 HTTP 헤더

HTTP 헤더는 웹 애플리케이션의 보안을 강화하는 데 중요한 역할을 합니다. 몇 가지 주요 보안 헤더와 그 역할을 살펴보겠습니다.

  1. Content-Security-Policy (CSP)
    • 웹 페이지가 로드할 수 있는 리소스의 출처를 제한하여 XSS 공격 등을 방지합니다.
    • 예시: Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.example.com
  2. Strict-Transport-Security (HSTS)
    • 클라이언트가 HTTPS를 통해서만 서버에 접속하도록 강제합니다.
    • 예시: Strict-Transport-Security: max-age=31536000; includeSubDomains
  3. X-Content-Type-Options
    • 브라우저가 콘텐츠의 MIME 타입을 추측하지 못하도록 설정하여 MIME 스니핑 공격을 방지합니다.
    • 예시: X-Content-Type-Options: nosniff
  4. X-Frame-Options
    • 웹 페이지가 <iframe> 등으로 삽입되는 것을 제어하여 클릭재킹 공격을 방지합니다.
    • 값: DENY, SAMEORIGIN, ALLOW-FROM uri
    • 예시: X-Frame-Options: SAMEORIGIN
  5. Referrer-Policy
    • 브라우저가 Referer 헤더에 포함할 정보를 제어하여 개인정보 유출을 방지합니다.
    • 예시: Referrer-Policy: no-referrer, strict-origin-when-cross-origin
  6. Feature-Policy (현재는 Permissions-Policy로 대체)
    • 웹 페이지가 사용할 수 있는 브라우저 기능을 제한하여 보안을 강화합니다.
    • 예시: Permissions-Policy: geolocation=(), microphone=()

HTTP 헤더 활용 팁

  1. 헤더 최적화
    • 불필요한 헤더는 제거하여 요청과 응답의 크기를 줄이고 성능을 향상시킵니다.
    • 예: 개발 중에는 디버깅을 위해 많은 헤더를 사용하지만, 배포 시에는 필요한 헤더만 유지합니다.
  2. 캐싱 전략 수립
    • Cache-Control과 Expires 헤더를 적절히 설정하여 캐시 효율을 극대화합니다.
    • 예: 정적 자원에 대해 긴 max-age를 설정하고, 동적 자원에 대해서는 짧은 max-age 또는 no-cache를 설정합니다.
  3. 보안 헤더 적용
    • 위에서 언급한 보안 관련 헤더들을 적용하여 웹 애플리케이션의 보안을 강화합니다.
    • 예: CSP를 통해 허용된 스크립트 출처만 로드하도록 설정합니다.
  4. 콘텐츠 협상 활용
    • 다양한 클라이언트 환경에 맞춰 콘텐츠를 최적화하여 사용자 경험을 향상시킵니다.
    • 예: 모바일 기기에는 경량화된 이미지를 제공하고, 데스크탑에는 고해상도 이미지를 제공합니다.
  5. 커스텀 헤더 사용
    • 애플리케이션 특화 정보를 전달하기 위해 커스텀 헤더를 사용할 수 있습니다.
    • 예: X-Request-ID: 12345를 사용하여 각 요청을 추적합니다.
    • 주의: 커스텀 헤더는 표준화되지 않았으므로, 네이밍 규칙을 준수하고 필요 시 문서화합니다.

HTTP 헤더 검사 방법

HTTP 헤더는 개발 및 디버깅 시 중요한 정보를 제공합니다. 브라우저 개발자 도구나 다양한 도구를 사용하여 헤더를 검사할 수 있습니다.

  1. 브라우저 개발자 도구
    • 대부분의 브라우저(Chrome, Firefox, Edge 등)에는 개발자 도구가 내장되어 있습니다.
    • Chrome 예시:
      1. 웹 페이지에서 오른쪽 클릭 후 "검사" 선택
      2. "Network" 탭 선택
      3. 요청을 클릭하여 "Headers" 섹션에서 요청 및 응답 헤더 확인
  2. cURL
    • 커맨드 라인 도구로, HTTP 요청을 보내고 헤더를 확인할 수 있습니다.
    • 예시: curl -I https://www.example.com
  3. Postman
    • API 개발 및 테스트 도구로, 요청과 응답의 헤더를 쉽게 확인할 수 있습니다.
    • GUI를 통해 다양한 요청을 구성하고 헤더를 분석할 수 있습니다.
반응형

댓글