반응형
요청 시 활용되는 HTTP 헤더
- Host
- 요청을 보낼 호스트를 나타내는 헤더로 도메인 네임으로 명시되며, 포트 번호가 포함될 수도 있습니다.
- 예시: Host: www.example.com:80
- 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
- Referer
- 요청을 보낼 때 현재 머무르고 있던 URL을 명시합니다.
- 이를 통해 유입 경로를 파악할 수 있습니다.
- 예시: Referer: https://www.google.com/
- Authorization
- 클라이언트의 인증 정보를 담는 헤더로, 인증 타입과 인증을 위한 정보가 명시됩니다.
- 기본적으로 Basic 타입의 인증을 사용하며, Base64로 인코딩됩니다.
- 예시: Authorization: Basic dXNlcjpwYXNz
- Accept
- 클라이언트가 처리할 수 있는 미디어 타입을 서버에 전달합니다.
- 예시: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- Accept-Encoding
- 클라이언트가 지원하는 콘텐츠 인코딩 방식을 서버에 전달합니다.
- 예시: Accept-Encoding: gzip, deflate, br
- Accept-Language
- 클라이언트가 선호하는 언어를 서버에 전달합니다.
- 예시: Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
- Cookie
- 클라이언트가 이전에 서버로부터 받은 쿠키를 서버에 전달합니다.
- 예시: Cookie: sessionId=abc123; theme=light
응답 시 활용되는 HTTP 헤더
- Server
- 요청을 처리하는 서버 측의 소프트웨어와 관련된 정보를 명시합니다. 예: Apache/2.4.1 (Unix)
- Allow
- 클라이언트에게 허용된 HTTP 메서드 목록을 알려주기 위해 사용됩니다.
- 예시: Allow: GET, POST, OPTIONS
- Retry-After
- 자원을 사용할 수 있는 날짜 혹은 시각을 나타내며, 주로 503 에러와 함께 사용됩니다.
- 예시: Retry-After: 120 (초 단위)
- Location
- 클라이언트에게 자원의 위치를 알려주기 위해 사용되며, 주로 리다이렉션이 발생했을 때 사용됩니다.
- 예시: Location: https://www.example.com/new-page
- WWW-Authenticate
- 상태 코드 401과 함께 사용되는 헤더로, 인증 방식을 설명합니다.
- 실제로는 이보다 더 많은 정보를 제공하기도 합니다. 예: Basic, 보안 영역, 문자 집합 등
- 인증 과정:
- 인증되지 않은 클라이언트가 서버에 GET 요청 전송
- 서버는 401과 WWW-Authenticate 헤더를 통해 인증 방식을 알림
- 클라이언트는 인증 정보를 입력
- 인증 정보를 Base64로 인코딩한 값을 Authorization 헤더를 통해 GET 요청
- 서버는 인증 정보를 확인
- 인증이 유효하면 200, 아니면 401로 응답
- Set-Cookie
- 서버가 클라이언트에 쿠키를 설정할 때 사용하는 헤더입니다.
- 예시: Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure
- Content-Security-Policy (CSP)
- 웹 페이지가 로드할 수 있는 리소스의 출처를 제어하여 XSS 공격 등을 방지합니다.
- 예시: Content-Security-Policy: default-src 'self'; img-src https://*;
- Strict-Transport-Security (HSTS)
- 클라이언트가 HTTPS를 통해서만 서버에 접속하도록 강제합니다.
- 예시: Strict-Transport-Security: max-age=31536000; includeSubDomains
요청과 응답 모두에게 활용되는 HTTP 헤더
- Date
- 메시지가 생성된 날짜와 시각에 관련된 정보를 담은 헤더입니다.
- 예시: Date: Wed, 21 Oct 2023 07:28:00 GMT
- Connection
- 요청과 응답 간의 연결 방식을 설정하는 헤더입니다.
- 예시: Connection: keep-alive
- Content-Length
- 본문의 바이트 단위 크기(길이)를 나타냅니다.
- 예시: Content-Length: 348
- 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
- Content-Type: 미디어 타입을 담고 있으며, 문자 인코딩 정보를 포함할 수 있습니다.
- 전송하려는 메시지 본문의 표현 방식을 설정하는 헤더로, 표현 헤더의 일종입니다.
- Cache-Control
- 캐시의 동작 방식을 제어합니다.
- 예시: Cache-Control: no-cache, no-store, must-revalidate
- Pragma
- HTTP/1.0 캐시 제어 헤더로, 주로 no-cache 값을 사용합니다.
- 예시: Pragma: no-cache
- ETag
- 특정 리소스의 버전을 식별하는 고유한 식별자입니다.
- 예시: ETag: "686897696a7c876b7e"
- Last-Modified
- 리소스가 마지막으로 수정된 날짜와 시각을 나타냅니다.
- 예시: Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
반응형
캐시
캐시는 원본 데이터의 사본을 임시로 저장하는 기술로, 캐시한다 또는 캐싱한다고 표현합니다. 캐시는 웹 성능 향상과 서버 부하 감소에 중요한 역할을 합니다.
- 개인 전용 캐시
- 웹 브라우저에 저장되어 있는 캐시입니다.
- 예: 브라우저가 방문한 웹 페이지의 이미지, CSS, JavaScript 파일 등을 저장하여 재방문 시 빠르게 로드합니다.
- 공용 캐시
- 클라이언트와 서버 사이에 위치한 중간 서버(프록시 서버 등)에 저장되어 있는 캐시입니다.
- 여러 사용자가 동일한 리소스를 요청할 때, 중간 서버가 캐시된 데이터를 제공하여 네트워크 대역폭과 서버 부하를 줄입니다.
- 캐시 신선도
- 캐시된 사본 데이터가 얼마나 최신 원본 데이터와 유사한지를 나타냅니다.
- 유효 기간 부여 방법:
- 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"
- Expires 헤더와 Cache-Control 헤더의 Max-Age 값을 사용할 수 있습니다.
- 캐시 무효화 (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시간)
- HttpOnly:
콘텐츠 협상과 표현
콘텐츠 협상과 표현은 클라이언트에게 가장 적합한 자원의 표현을 제공하는 메커니즘을 의미합니다. 클라이언트의 선호도에 따라 우선순위를 반영할 수 있습니다. 이를 통해 다양한 클라이언트 환경에 최적화된 콘텐츠를 제공할 수 있습니다.
- 미디어 타입 협상
- 클라이언트가 Accept 헤더를 통해 지원하는 미디어 타입을 서버에 전달하면, 서버는 이에 맞는 콘텐츠를 제공합니다.
- 예시: 클라이언트가 Accept: application/json을 보냈을 때, 서버는 JSON 형식의 응답을 보냅니다.
- 언어 협상
- 클라이언트가 Accept-Language 헤더를 통해 선호하는 언어를 서버에 전달하면, 서버는 해당 언어로 콘텐츠를 제공합니다.
- 예시: Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7일 때, 서버는 한국어 콘텐츠를 우선 제공하고 필요 시 영어로 제공할 수 있습니다.
- 인코딩 협상
- 클라이언트가 Accept-Encoding 헤더를 통해 지원하는 인코딩 방식을 서버에 전달하면, 서버는 이를 활용해 콘텐츠를 압축하여 전송합니다.
- 예시: Accept-Encoding: gzip, deflate, br일 때, 서버는 gzip으로 압축된 응답을 보낼 수 있습니다.
- 캐릭터 인코딩 협상
- 클라이언트가 Accept-Charset 헤더를 통해 지원하는 문자 인코딩을 서버에 전달하면, 서버는 이에 맞게 콘텐츠를 인코딩합니다.
- 예시: Accept-Charset: utf-8, iso-8859-1;q=0.5
추가로
보안 관련 HTTP 헤더
HTTP 헤더는 웹 애플리케이션의 보안을 강화하는 데 중요한 역할을 합니다. 몇 가지 주요 보안 헤더와 그 역할을 살펴보겠습니다.
- Content-Security-Policy (CSP)
- 웹 페이지가 로드할 수 있는 리소스의 출처를 제한하여 XSS 공격 등을 방지합니다.
- 예시: Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.example.com
- Strict-Transport-Security (HSTS)
- 클라이언트가 HTTPS를 통해서만 서버에 접속하도록 강제합니다.
- 예시: Strict-Transport-Security: max-age=31536000; includeSubDomains
- X-Content-Type-Options
- 브라우저가 콘텐츠의 MIME 타입을 추측하지 못하도록 설정하여 MIME 스니핑 공격을 방지합니다.
- 예시: X-Content-Type-Options: nosniff
- X-Frame-Options
- 웹 페이지가 <iframe> 등으로 삽입되는 것을 제어하여 클릭재킹 공격을 방지합니다.
- 값: DENY, SAMEORIGIN, ALLOW-FROM uri
- 예시: X-Frame-Options: SAMEORIGIN
- Referrer-Policy
- 브라우저가 Referer 헤더에 포함할 정보를 제어하여 개인정보 유출을 방지합니다.
- 예시: Referrer-Policy: no-referrer, strict-origin-when-cross-origin
- Feature-Policy (현재는 Permissions-Policy로 대체)
- 웹 페이지가 사용할 수 있는 브라우저 기능을 제한하여 보안을 강화합니다.
- 예시: Permissions-Policy: geolocation=(), microphone=()
HTTP 헤더 활용 팁
- 헤더 최적화
- 불필요한 헤더는 제거하여 요청과 응답의 크기를 줄이고 성능을 향상시킵니다.
- 예: 개발 중에는 디버깅을 위해 많은 헤더를 사용하지만, 배포 시에는 필요한 헤더만 유지합니다.
- 캐싱 전략 수립
- Cache-Control과 Expires 헤더를 적절히 설정하여 캐시 효율을 극대화합니다.
- 예: 정적 자원에 대해 긴 max-age를 설정하고, 동적 자원에 대해서는 짧은 max-age 또는 no-cache를 설정합니다.
- 보안 헤더 적용
- 위에서 언급한 보안 관련 헤더들을 적용하여 웹 애플리케이션의 보안을 강화합니다.
- 예: CSP를 통해 허용된 스크립트 출처만 로드하도록 설정합니다.
- 콘텐츠 협상 활용
- 다양한 클라이언트 환경에 맞춰 콘텐츠를 최적화하여 사용자 경험을 향상시킵니다.
- 예: 모바일 기기에는 경량화된 이미지를 제공하고, 데스크탑에는 고해상도 이미지를 제공합니다.
- 커스텀 헤더 사용
- 애플리케이션 특화 정보를 전달하기 위해 커스텀 헤더를 사용할 수 있습니다.
- 예: X-Request-ID: 12345를 사용하여 각 요청을 추적합니다.
- 주의: 커스텀 헤더는 표준화되지 않았으므로, 네이밍 규칙을 준수하고 필요 시 문서화합니다.
HTTP 헤더 검사 방법
HTTP 헤더는 개발 및 디버깅 시 중요한 정보를 제공합니다. 브라우저 개발자 도구나 다양한 도구를 사용하여 헤더를 검사할 수 있습니다.
- 브라우저 개발자 도구
- 대부분의 브라우저(Chrome, Firefox, Edge 등)에는 개발자 도구가 내장되어 있습니다.
- Chrome 예시:
- 웹 페이지에서 오른쪽 클릭 후 "검사" 선택
- "Network" 탭 선택
- 요청을 클릭하여 "Headers" 섹션에서 요청 및 응답 헤더 확인
- cURL
- 커맨드 라인 도구로, HTTP 요청을 보내고 헤더를 확인할 수 있습니다.
- 예시: curl -I https://www.example.com
- Postman
- API 개발 및 테스트 도구로, 요청과 응답의 헤더를 쉽게 확인할 수 있습니다.
- GUI를 통해 다양한 요청을 구성하고 헤더를 분석할 수 있습니다.
반응형
'개발자 일상 > 혼자 공부하는 네트워크' 카테고리의 다른 글
혼자 공부하는 네트워크 7-2 안전성을 위한 기술 공부 기록 (4) | 2024.10.13 |
---|---|
혼자 공부하는 네트워크 7-1 안전성을 위한 기술 공부 기록 (3) | 2024.10.13 |
혼자 공부하는 네트워크 5-2 HTTP (1) | 2024.10.06 |
혼자 공부하는 네트워크 5-1 DNS와 자원 공부기록 (1) | 2024.10.01 |
혼자 공부하는 네트워크 4-3 TCP의 오류,흐름,혼잡 제어 공부 기록 (0) | 2024.09.29 |
댓글