이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

그림으로 배우는 Http&Network Basic 정리 - 6장. HTTP 헤더(6.6~6.8)

  • 2025.03.02 20:32
  • Study Platform📚/그림으로 배우는 Http&Network Basic
    반응형

    6.6. 엔티티 헤더 필드

    엔티티 헤더(Entity Header)는 HTTP 요청(Request) 또는 응답(Response)의 본문(Body)에 대한 정보를 제공하는 헤더 필드이다.

    즉, 요청이든 응답이든 본문이 포함될 수 있기 때문에, 엔티티 헤더는 두 경우 모두 존재할 수 있습니다.

    • 요청(Request) 메시지에 포함될 때 → 클라이언트가 서버에 전송하는 데이터의 속성을 설명
    • 응답(Response) 메시지에 포함될 때 → 서버가 클라이언트에게 보내는 데이터의 속성을 설명

     

    6.6.1. Allow 

    Allow 헤더는 서버가 특정 리소스에 대해 허용하는 HTTP 메서드 목록을 나타내는 헤더입니다.
    즉, 클라이언트가 어떤 HTTP 메서드를 사용할 수 있는지 알려줍니다.

    405 응답이 발생할 때는 서버가 어떤 메서드를 허용하는지 명확하게 알려주기 위해 Allow 헤더를 보내는 것이 일반적인 방식이다.

    //✅ 서버가 GET, POST만 허용하는 경우
    HTTP/1.1 200 OK
    Allow: GET, POST
    
    //✅ 클라이언트가 DELETE를 요청했으나, 허용되지 않은 경우
    DELETE /resource HTTP/1.1
    Host: example.com
    
    //서버 응답
    HTTP/1.1 405 Method Not Allowed
    Allow: GET, POST

     

    6.6.2. Content Encoding

    Content-Encoding 헤더는 HTTP 메시지 본문(Body)이 어떤 방식으로 인코딩(압축)되었는지를 나타내는 엔티티 헤더이다.
    이 헤더를 사용하면 서버가 클라이언트에게 데이터를 압축하여 전송할 수 있다.

    Content-Encoding의 일반적인 값

    gzip Gzip 알고리즘으로 압축 (가장 일반적)
    deflate Deflate 알고리즘으로 압축
    br Brotli 알고리즘으로 압축 (최신 브라우저에서 선호)
    compress Unix compress 명령어 방식 (거의 사용되지 않음)
    identity 인코딩 없음 (기본값)

     

    6.6.3. Content Language

    Content-Language 헤더는 HTTP 응답에서 본문(Body)의 언어를 지정하는 엔티티 헤더이다.
    즉, 서버가 제공하는 컨텐츠(문서, 페이지, API 응답 등)가 어떤 언어로 작성되었는지를 나타낸다.

    HTTP/1.1 200 OK
    Content-Type: text/html; charset=UTF-8
    Content-Language: en, fr

    Content-Language와 Accept-Language 차이

    Content-Language 콘텐츠가 어떤 언어로 작성되었는지 서버가 클라이언트에게 알림 응답(Response) 헤더,요청헤더
    Accept-Language 클라이언트가 원하는 언어를 서버에 요청 요청(Request) 헤더

     

    6.6.4. Content-Location

    Content-Location 헤더는 응답(Response)에서 본문이 실제로 위치한 URL을 나타내는 엔티티 헤더이다.
    즉, 현재 응답이 참조하는 리소스의 "대체 위치"를 나타낸다.

     

     

    • Content-Location은 현재 응답 본문이 실제로 위치한 URL을 나타낸다.
    • 주로 리소스의 원본 위치를 제공하거나, 콘텐츠 협상(Content Negotiation)에서 사용된다.

    6.6.6. Content-md5

    Content-MD5는 HTTP 본문(Body)의 무결성을 검증하기 위해 사용되는 엔티티 헤더이다.
    즉, 서버가 응답을 보낼 때 본문의 MD5 해시 값을 포함하여, 클라이언트가 데이터를 정상적으로 받았는지 확인할 수 있도록 한다

     

    • MD5 해시를 Base64 인코딩한 문자열을 사용한다.
    • 16바이트(128비트)의 MD5 해시를 Base64로 변환하면 24자리 문자열이 생성된다.
    • 하지만 MD5의 보안 취약점 때문에 현대 웹에서는 거의 사용되지 않으며, 대신 ETag, SHA-256, Checksum 방식이 선호된다

    6.6.7. Conten-Range

    Content-Range는 HTTP 응답(Response)에서 본문의 일부만 전송할 때 사용되는 엔티티 헤더이다.
    즉, 파일의 특정 부분만 전송하는 "범위 요청(Range Request)"을 처리할 때 사용된다.

     

    • 클라이언트가 Range 요청을 보낼 경우, 서버는 206 Partial Content 응답과 함께 Content-Range를 포함하여 해당 범위만 반환할 수 있다.
    • 대용량 파일 다운로드, 동영상 스트리밍, 파일 업로드 재개 등의 기능에서 많이 사용된다. 🚀

    📌 Content-Type 헤더

    Content-Type은 HTTP 본문(Body)의 데이터 형식을 나타내는 엔티티 헤더이다.
    즉, 서버가 응답(Response)에서 본문의 MIME 타입을 명시하거나, 클라이언트가 요청(Request)에서 전송하는 데이터의 형식을 지정할 때 사용된다.

    Content-Type: <MIME 타입>[; charset=<문자 인코딩>]

     

     

    • MIME 타입(Multipurpose Internet Mail Extensions type): 데이터의 형식을 지정
    • 옵션으로 charset(문자 인코딩) 추가 가능
      • charset=UTF-8을 추가하면 클라이언트가 올바른 문자 인코딩을 사용할 수 있다.

    Expires 헤더

    Expires는 HTTP 응답(Response)에서 캐싱된 리소스의 만료 날짜와 시간을 지정하는 헤더이다.
    즉, 클라이언트(브라우저, 프록시 서버 등)가 특정 리소스를 언제까지 캐싱할 수 있는지를 나타낸다.

    Cache-Control: max-age > Expires

    ✅ Expires vs Cache-Control

    현대 웹에서는 Expires보다 Cache-Control: max-age 또는 ETag 기반의 캐싱 방식이 더 많이 사용된다.

    Expires 특정 날짜에 만료 절대 시간 (GMT) HTTP/1.0부터 지원
    Cache-Control: max-age 몇 초 후 만료 상대 시간 (초 단위) HTTP/1.1에서 권장

    📌 Last-Modified 헤더

    Last-Modified는 HTTP 응답(Response)에서 리소스가 마지막으로 수정된 날짜와 시간을 나타내는 엔티티 헤더이다.
    즉, 서버가 특정 리소스를 마지막으로 변경한 시점을 클라이언트에게 제공하여, 캐싱과 조건부 요청(If-Modified-Since)을 최적화하는 역할을 한다.

     

    HTTP/2 200 OK
    Cache-Control: max-age=86400, public
    ETag: "abc123"
    Last-Modified: Wed, 28 Feb 2025 12:00:00 GMT

     


     

    6.7. 쿠키를 위한 헤더 필드

    RFC 6265는 IETF(국제 인터넷 표준화 기구)에서 정의한 쿠키(Cookie)의 공식 표준 문서이다.

     

    1️⃣ 쿠키의 생성 및 사용

    • Set-Cookie : 쿠키를 설정하는 방식
    • Cookie : 클라이언트가 서버에 쿠키를 전달하는 방식

    2️⃣ 보안 관련 규칙

    • Secure: HTTPS 연결에서만 쿠키를 전송하도록 제한
    • HttpOnly: JavaScript에서 쿠키 접근을 막아 XSS(크로스 사이트 스크립팅) 공격을 방지

    3️⃣ 쿠키 속성

    • Domain: 쿠키를 사용할 도메인 지정
    • Path: 특정 경로에서만 쿠키를 전송하도록 제한
    • Max-Age/Expires: 쿠키의 유효 기간 설정

    ➡️ 최신 버전으로는 RFC 6265bis 개정안 존재한다. ( SamSIte 속성 개선 )

     

    6.7.1.  Set-Cookie 

    일반적인 HTTP 헤더는 ","를 이용해서 여러 값을 하나로 합칠 수 있었다.

    Cache-Control: no-store
    Cache-Control: no-cache
    
    //합쳐서 보낼경우
    Cache-Control: no-store, no-cache

    하지만, Set -Cookie 헤더의 속성 중 Expires는 날짜를 설정하는데, 날짜 형식에서 ","가 사용된다.

    Set-Cookie: sessionId=abc123; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Path=/;

     

    그렇기에, Set-Cookie 헤더는 1개에 1개의 쿠키만 설정하고 하나로 합치면 안된다.

    여러개의 쿠키를 저장해야할 경우 여러개의 Set-Cookie 헤더를 사용할 것을 권장하고 있다.

     

    Set-Cookie: <cookie-name>=<cookie-value>; [옵션]

     

    • cookie-name: 쿠키의 이름
      → 제어 문자(Control Character), 공백(Space), 탭(Tab)을 제외한 ASCII 문자만 가능
      → 특수 문자(예: , ; " \ 등)는 사용할 수 없음.
    • cookie-value: 쿠키에 저장할 값
      → 일반적으로 URL 인코딩된 값이 들어감.

    🔹 쿠키 이름의 접두사(Prefix)를 통한 보안 옵션 적용

     

    쿠키 이름 앞에 특정한 접두사(__Secure-, __Host-)를 붙이면 추가적인 보안 규칙이 적용된다.

    ✅ 1. __Secure- (보안 쿠키)

    Set-Cookie: __Secure-session=abc123; Secure; Path=/; HttpOnly;

    __Secure- → HTTPS에서만 쿠키를 설정할 수 있다. (HTTP에서는 Set-Cookie자체가 차단됨).

     

    ✅ 2. __Host- (더 강력한 보안 쿠키)

    Set-Cookie: __Host-session=xyz789; Secure; Path=/; HttpOnly;

     

    • 도메인을 지정하면 안 됨 (Domain 속성을 사용하면 안 됨)
    • Path는 반드시 / 로 설정 (서브 디렉터리 제한 불가)
    • 서브도메인에서 쿠키가 공유되지 않도록 제한하려면 __Host-를 사용하면 된다.

     

    1️⃣ Expires 속성

    Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>

     

    Expires 속성은 쿠키가 언제 만료될지를 설정하는 속성이다.

    설정된 시간 이후에는 브라우저가 해당 쿠키를 자동으로 삭제된다. 절대 시간(UTC 기준 날짜 & 시간)으로 지정된다.

    Expires 속성이 없으면 쿠키는 브라우저가 종료될 때까지 유지된다. => 세션쿠키

    즉, Expires를 설정하면 "영구 쿠키(Persistent Cookie)", 없으면 "세션 쿠키(Session Cookie)".

    Max-Age와 함께 사용하면 최신 브라우저와 구형 브라우저 모두에서 호환성 보장 가능하다. 참고로, Expires와 Max-Age속성이 동시에 설정되면, Max-Age가 우선순위를 가집니다.

     

    2️⃣ Path 속성

    Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>

     

    Path 속성은 쿠키가 어느 URL 경로에서 유효한지를 정하는 속성이다.

    Path 속성을 명시하지 않으면 기본적으로 현재 URL의 경로에서만 유효하다.

    Path =/; 로 설정하면 사이트 전체에서 쿠키 사용이 가능하다.

    Path=/admin; 로 설정하면 하위 경로(/admin/settings, /admin/users)에서만 쿠키가 전송된다.

     

    3️⃣ Domain 속성

    Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>

     

    Domain 속성은 쿠키가 어느 도메인에서 유효한지를 정하는 속성이다.

     이 속성을 설정하면 해당 도메인과 서브도메인(subdomain)에서도 쿠키를 사용할 수 있다

    예를 들어서, https://naver.com 으로 속성을 설정하면, 서브도메인인 https://section.blog.naver.com/ 도 사용가능하다.

     

    4️⃣ Secure 속성

    Secure 속성은 쿠키가 HTTPS에서만 전송되도록 강제하는 속성이다.

    Secure가 없으면 HTTP에서도 쿠키가 전송될 수 있어 중간자 공격(MITM)에 취약하다.

    속성 Secure 속성 __Secure- 쿠키
    역할 HTTPS에서만 쿠키를 전송 HTTPS에서만 쿠키 설정이 가능
    HTTP에서 사용 가능 여부 ❌ (HTTP에서 쿠키 전송 불가) ❌ (HTTP에서 Set-Cookie 자체가 차단됨)

     

    5️⃣ HttpOnly 속성

    HttpOnly 속성은 쿠키를 JavaScript에서 접근하지 못하도록 막는 속성이다.

    즉, HttpOnly가 설정된 쿠키는 document.cookie를 통해 읽을 수 없고, 오직 서버와의 HTTP 요청을 통해서만 전송된다.

    그래서 사진과 보이는것과 같이 HttpOnly를 설정할 경우, console.log(document.cookie) 사용시 출력되지 않는다.

    그렇기에 XSS(크로스사이트 스크립팅) 공격을 방지 할 수 있다.

     

     

     

    6️⃣ SamSite 속성

    SameSite 속성은 쿠키가 크로스 사이트 요청(다른 도메인에서의 요청)에서 전송될지 여부를 결정하는 속성이다.
    즉, CSRF(크로스 사이트 요청 위조) 공격을 방지하기 위해 쿠키의 동작을 제한하는 역할을 한다.

     

    • SameSite를 설정하지 않으면 브라우저 기본값(Lax)이 적용됨.
    • SameSite=None을 사용할 경우 Secure 속성이 필수임.
    Strict 가장 강력한 보안, 크로스 사이트 요청에서 쿠키 전송 안 됨 최고 수준의 보안이 필요한 로그인 세션
    Lax (기본값) GET 요청에서는 쿠키 전송됨, CSRF 공격 방어 보안 & UX 균형 (일반적인 로그인 유지)
    None 모든 요청에서 쿠키 전송됨 (단, Secure 필수) 크로스 사이트 인증, 광고, 결제 서비스

     

     

    6.7.2.  Cookie 헤더

    Cookie 헤더는 클라이언트(브라우저)가 서버로 쿠키 데이터를 전송할 때 사용하는 HTTP 요청 헤더이다.

    사용자가 방문한 웹사이트에서 설정한 쿠키가 요청과 함께 자동으로 전송된다.

    GET /dashboard HTTP/1.1
    Host: example.com
    Cookie: sessionId=abc123;

     

    🔹 Cookie 헤더와 Set-Cookie 차이점

    Set-Cookie 서버 → 클라이언트 서버가 클라이언트에 쿠키 저장 요청
    Cookie 클라이언트 → 서버 클라이언트가 서버에 저장된 쿠키 전달

     


    6.8. 그 이외의 헤더 필드

    6.8.1. X-Frame-Options 

    X-Frame-Options 헤더는 웹사이트가 iframe, object, embed 태그를 통해 다른 사이트에 포함되는 것을 제한하는 HTTP 응답 헤더다. 
    이를 통해  클릭재킹(Clickjacking) 공격을 방지할 수 있다.

    클릭재킹(Clickjacking)은 사용자가 본인도 모르게 악성 사이트에서 특정 버튼이나 링크를 클릭하도록 유도하는 공격 기법이다.
    공격자는 보통 <iframe>을 사용해 사용자가 원치 않는 행동(예: 계정 탈취, 결제, 권한 변경 등)을 하게 만든다

    헤더 옵션 보안 설명
    DENY ✅ 강력 추천 어떤 경우에도 <iframe> 안에서 페이지 로딩 차단 (가장 강력한 보안)
    SAMEORIGIN ✅ 추천 같은 도메인에서만 <iframe> 허용 (자사 서비스 내에서는 허용 가능)
    ALLOW-FROM <URL> ❌ 비추천
    => CSP 사용 추천
    지원하는 브라우저가 거의 없음, 대신 frame-ancestors 사용하여 대체가 가능하다.

     

    6.8.2. X-XSS-Protection 

    X-XSS-Protection은 브라우저에서 XSS(크로스사이트 스크립팅) 공격을 탐지하고 차단하는 HTTP 응답 헤더다.
    과거에는 브라우저가 자동으로 XSS 공격을 탐지하고 차단하는 기능을 제공했지만, 현재 대부분의 최신 브라우저에서는 이 기능이 제거되었거나 Content-Security-Policy (CSP)를 사용하는 것이 권장되고 있다.

    헤더 값 설명
    0 XSS 보호 기능 끄기
    1 XSS 보호 기능 켜기

     

    6.8.3. DNT

    DNT(Do Not Track) 헤더는 사용자가 웹사이트 및 광고 네트워크에 대해 자신의 온라인 활동 추적을 원하지 않는다는 의사를 전달하는 HTTP 요청 헤더다.

    현재는 대부분의 최신 브라우저에서 지원을 중단하고 웹 표준에서도 제외된다.

    헤더 값 의미
    0 사용자가 추적을 허용함 
    1 사용자가 추적을 거부함 

     

    6.8.4. P3P

    P3P(Platform for Privacy Preferences)는 웹사이트가 사용자의 개인정보 보호 정책을 XML 형식으로 기술하여 브라우저가 이를 자동으로 해석할 수 있도록 하는 W3C 표준이었다.

     

    사용자는 P3P를 통해 자신의 개인정보가 어떻게 사용될지 미리 알 수 있도록 설계되었으나, 이것또한,, 잘 사용하지 않는 기술이라고 한다.

     

    반응형

    'Study Platform📚 > 그림으로 배우는 Http&Network Basic' 카테고리의 다른 글

    그림으로 배우는 Http&Network Basic 정리 - 9장. HTTP에 기능을 추가한 프로토콜  (0) 2025.03.06
    그림으로 배우는 Http&Network Basic 정리 - 7장. 웹을 안전하게 지켜주는 HTTPS  (0) 2025.03.02
    그림으로 배우는 Http&Network Basic 정리 - 5장. HTTP와 연계하는 웹 서버  (0) 2025.02.18
    그림으로 배우는 Http&Network Basic 정리 - 4장. 결과를 전달하는 HTTP 상태 코드  (0) 2025.02.16
    그림으로 배우는 Http&Network Basic 정리 - 3장. HTTP 정보는 HTTP 메세지에 있다  (1) 2025.02.12

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 그림으로 배우는 Http&Network Basic 정리 - 9장. HTTP에 기능을 추가한 프로토콜

      그림으로 배우는 Http&Network Basic 정리 - 9장. HTTP에 기능을 추가한 프로토콜

      2025.03.06
    • 그림으로 배우는 Http&Network Basic 정리 - 7장. 웹을 안전하게 지켜주는 HTTPS

      그림으로 배우는 Http&Network Basic 정리 - 7장. 웹을 안전하게 지켜주는 HTTPS

      2025.03.02
    • 그림으로 배우는 Http&Network Basic 정리 - 5장. HTTP와 연계하는 웹 서버

      그림으로 배우는 Http&Network Basic 정리 - 5장. HTTP와 연계하는 웹 서버

      2025.02.18
    • 그림으로 배우는 Http&Network Basic 정리 - 4장. 결과를 전달하는 HTTP 상태 코드

      그림으로 배우는 Http&Network Basic 정리 - 4장. 결과를 전달하는 HTTP 상태 코드

      2025.02.16
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (172)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (28)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
        • AWS SAA C03공부하기 (3)
      • 까먹을까봐 적는 것들 (5)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • 티스토리챌린지
    • 99클럽
    • 오블완
    • 프로그래머스
    • 항해99
    • TiL
    • 백준
    • 코딩테스트준비

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바