HTTP, 캐시, 쿠키

이선우·2024년 9월 1일
1

CS 공부

목록 보기
6/10
post-custom-banner

HTTP 메시지 개관

HTTP 메시지 개요

HTTP 메시지는 웹 상에서 클라이언트와 서버 간에 데이터를 교환하기 위해 사용되는 메시지 포맷입니다. HTTP 메시지는 크게 두 가지로 나뉩니다.

  • 요청 메시지: 클라이언트가 서버에 정보를 요청할 때 사용
  • 응답 메시지: 서버가 클라이언트의 요청에 대해 응답할 때 사용

HTTP 메시지의 구조

HTTP 메시지는 다음과 같은 기본 구조로 이루어져 있습니다.

  • 시작 라인(Start Line)
    요청 메시지에서는 HTTP 메서드, 요청 대상(URI), HTTP 버전으로 구성
    응답 메시지에서는 HTTP 버전, 상태 코드, 이유 문구로 구성
  • 헤더(Header)
    다양한 헤더 필드들이 존재하며, 이들은 요청이나 응답에 대한 추가 정보를 제공
  • 본문(Body)
    선택적으로 사용되며, 주로 POST나 PUT 요청에서 데이터 전송을 위해 사용

HTTP 메서드

HTTP 메서드는 클라이언트가 서버에 어떤 동작을 요청하는지를 정의

  1. GET
    서버로부터 자원을 요청하는 메서드로 주로 데이터 조회에 사용되며, 요청 본문이 없다

  2. POST
    서버로 데이터를 전송하고, 그 데이터를 처리하도록 요청하는 메서드로 주로 자원 생성이나 데이터 처리를 위해 사용

  3. PUT
    서버의 자원을 덮어쓰는 메서드로 자원이 존재하지 않으면 새로 생성하기도 한다

  4. PATCH
    자원의 일부를 수정하는 메서드

  5. DELETE
    서버에서 자원을 삭제하는 메서드

HTTP 상태코드

HTTP 상태 코드는 서버가 클라이언트의 요청을 처리한 결과를 나타낸다. 5가지의 범주로 나타낸다

  1. 1XX(정보)
    요청이 수신되었으며, 처리가 계속 진행됨을 나타낸다

  2. 2XX(성공)
    요청이 성공적으로 처리되었음을 나타낸다

  3. 3XX(리다이렉션)
    클라이언트가 요청한 리소스가 다른 위치로 이동되었음을 나타낸다

  4. 4XX(클라이언트 오류)
    클라이언트의 잘못된 요청으로 인해 오류가 발생함을 나타낸다

  5. 5XX(서버 오류)
    서버에서 요청을 처리하는 도중 오류가 발생했음을 나타낸다

HTTP 요청 및 응답 헤더 필드

HTTP 헤더는 요청과 응답에 대한 추가 정보를 제공하는 필드로, 매우 다양하게 사용된다.

  • Request Headers
    클라이언트가 서버에 요청할 때 추가적인 정보를 제공하는 헤더
    ex) User-Agent, Accept, Authorization

  • Response Headers
    서버가 클라이언트에 응답할 때 제공하는 추가적인 정보를 담고 있다
    ex) Content-Type, Set-Cookie, Location

헤더 필드는 HTTP 메시지의 기능을 확장하고, 보다 효율적인 통신을 가능하게 한다

기타 중요한 개념

  • 멱등성(Idempotency): 멱등성은 동일한 요청을 여러 번 보내더라도, 결과가 처음 요청과 동일한지를 의미한다. 예를 들어 GET, PUT, DELETE 메서드는 멱등성이 있는 메서드이다.

  • 캐시 가능성(Cacheability): 캐시 가능성은 서버의 응답을 클라이언트나 중간 캐시가 저장할 수 있는지 여부를 나타낸다. 에를 들어, GET 응답은 캐시될 수 있지만, POST 응답은 일반적으로 캐시되지 않는다.


HTTP 헤더

HTTP 헤더의 개요

HTTP 헤더는 헤더 필드라고 불리며, 각 필드는 이름과 값으로 구성된다. 일반 적으로 다음과 같은 형식으로 구성된다.
header-field = field name ":" field-value
이 형식은 HTTP 메시지의 전송 시 필요한 추가 정보를 제공한다.

주요 HTTP 헤더 필드

HTTP 헤더에는 다양한 필드가 있으며, 그 중 자주 사용되는 헤더 필드는 아래와 같다.

  1. 요청(Request) 관련 헤더 필드

    • Host: 요청 대상 서버의 호스트명과 포트 정보를 나타낸다
    • Referer: 클라이언트가 이전에 방문한 URL을 가리킨다.
    • User-Agent: 클라이언트 소프트웨어의 이름과 버전을 나타내며, 주로 브라우저 정보를 담고 있다
  2. 응답(Response) 관련 헤더 필드

    • Server: 서버 소프트웨어의 이름과 버전을 나타낸다
    • Location: 리다이렉션 시 클라이언트를 이동시킬 새로운 URL을 나타낸다.
  3. 대표적인 헤더 필드 예시
    Host: Host: www.example.com
    요청이 www.example.com 서버에 보내졌음을 의미합니다.

Date: Date: Mon, 27 Sep 2021 12:00:00 GMT
요청 또는 응답이 발생한 시간을 나타냅니다.

Referer: Referer: http://previous.page.com
클라이언트가 이 페이지로 이동하기 전에 방문한 페이지의 URL입니다.

User-Agent: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
클라이언트가 사용하는 브라우저와 운영체제에 대한 정보입니다. 여기서 클라이언트는 윈도우 10을 사용하는 크롬 브라우저입니다.

Server: Server: Apache/2.4.41 (Ubuntu)
서버가 Apache 웹 서버를 사용하고 있음을 나타냅니다.

Location: Location: https://new-url.com
리다이렉션 시 이동할 경로이다.

콘텐츠 관련 필드

  1. Content-Type
    요청 또는 응답에서 사용되는 콘텐츠의 유형을 나타낸다.
    - text/html; charset=utf-8: HTML 문서로, UTF-8 인코딩을 사용합니다.
    - application/json: JSON 형식의 데이터를 사용합니다.
    - image/png: PNG 이미지 파일입니다.

  2. Content-Encoding
    콘텐츠의 인코딩 및 압축 방식을 나타낸다

  3. Content-Length
    콘텐츠의 길이를 바이트 단위로 나타낸다

  4. Content-Language
    콘텐츠의 언어를 나타낸다


캐시

캐시의 개념

캐시는 네트워크에서 자원의 사본을 임시 저장하는 기술이다. HTTP 프로토콜은 기본적으로 상태를 유지하지 않는 무상태 프로토콜이기 때문에, 동일한 자원에 대한 요청이 반복될 경우 서버는 매번 자원을 새롭게 응답해야한다. 이를 보완하기 위해 캐시가 사용된다.

캐시된 자원은 다음과 같은 위치에 저장될 수 있다.

  • 클라이언트(브라우저) 캐시: 사용자의 브라우저가 자원을 로컬에 저장한다.
  • 캐시 서버/프록시 서버: 중간 서버가 자원의 사본을 저장하여 어러 클라이언트 요청에 대해 빠르게 응답할 수 있다.

Cache-Control 헤더

캐시의 동작을 제어하기 위해 Cache-Control 헤더가 사용된다. 이 헤더는 캐시의 사용 여부와 조건을 명시한다.

  • max-age=숫자(초): 자원을 캐시할 수 있는 최대 시간을 초 단위로 설정한다
  • no-cache: 자원을 캐시할 수는 있지만, 항상 원본 서버에 자원의 유효성을 검증해야 한다
  • no-store: 자원을 캐시해서는 안된다. 이 설정은 자원의 보안이 중요한 경우에 사용된다.

캐시된 자원의 유효 기간

캐시된 자원은 무한히 유효하지 않으며, 일정 기간 동안만 유효하다. 자원의 마지막 변경 시점을 나타내는 Last-Modified 헤더가 이를 관리하는 데 사용된다.

캐시된 자원의 변경

캐시된 자원이 변경된 경우, 클라이언트는 이를 인지하고 새로운 자원을 받아야 한다. 자원의 변경 여부를 확인하는 두 가지 주요 방법이 있다.

  1. If-Modified-Since 헤더
    클라이언트는 요청 시 If-Modified-Since 헤더를 사용하여 특정 시점 이후 자원이 변경되었는지를 서버에 묻는다. 만약 자원이 변경되지 않았다면 서버는 304 응답을 보내며 이는 클라이언트가 캐시된 자원을 그대로 사용할 수 있음을 나타낸다.

  2. ETag(Entity Tag)
    서버는 자원에 대해 고유한 식별자인 ETag값을 부여한다. 클라이언트는 이후 요청에서 If-None-Match 헤더를 통해 이 ETag값이 변경되었는지 확인할 수 있다.


쿠키

쿠키란 무엇인가?

쿠키는 서버에서 클라이언트로 전송된 정보를 임시로 저장하는 작은 데이터 조각이다. 쿠키는 이름=값의 형태로 저장되며, 주로 세션 유지, 사용자 추적, 사용자 설정 저장 등의 목적으로 사용된다. 쿠키는 다음과 같은 특징을 가지고 있다.

  • 유효 기간: 쿠키는 유효 기간이 설정되며, 그 기간이 지나면 자동으로 삭제된다.
  • 도메인 및 경로: 쿠키가 적용되는 도메인과 경로가 설정되어 있어, 특정 도메인이나 경로에서만 쿠키가 전송된다.

쿠키의 동작 방식

서버는 Set-Cookie 헤더를 통해 쿠키를 클라이언트로 전송된다. 클라이언트는 이 쿠키를 저장하고, 이후 해당 도메인으로의 요청 시 Cookie 헤더에 쿠키를 포함시켜 서버로 전송한다. 이를 통해 서버는 클라이언트를 식별하고 이전 상태를 유지할 수 있다.

쿠키의 도메인과 경로

  • 도메인: Set-Cookie: domain=example.com으로 설정된 쿠키는 example.com과 그 하위 도메인에서 사용된다.
  • 경로: Set-Cookie: path=/posts로 설정된 쿠키는 /posts 경로 및 그 하위 경로에서만 유효하다

쿠키의 유효 기간 설정

쿠키의 유효 기간은 다음과 같은 두 가지 방법으로 설정된다.

  • expires: Set-Cookie: expires=Wed, 10 Aug 2023 12:00:00 GMT와 같이 특정 만료일을 설정합니다.
  • max-age: Set-Cookie: max-age=1000과 같이 설정된 초 단위로 쿠키의 수명을 지정할 수 있습니다. 이 예에서는 쿠키가 1000초 동안 유효합니다.

쿠키와 보안

쿠키는 민감한 정보를 저장할 수 있으므로 보안에 대한 주의가 필요하다.

  • Secure: 쿠키를 HTTPS를 통해서만 전송하도록 설정한다. 이를 통해 전송 중에 쿠키가 도청될 위험을 줄인다.
  • HTTPOnly: 쿠키에 자바스크립트를 통해 접근할 수 없도록 설정한다. 이는 XSS 공격을 방지하는 데 유용하다

쿠키와 세션

쿠키와 세션은 사용자 상태를 유지하는 두 가지 방법이다.

  • 쿠키: 클라이언트측에 저장되고 관리된다.
  • 세션: 서버 측에서 관리되며, 서버는 클라이언트를 식별하기 위해 세션 ID를 쿠키로 클라이언트에 전달한다. 이후 클라이언트는 요청 시 이 세션 ID를 서버에 다시 전송하여 상태를 유지한다
profile
백엔드 개발자 준비생
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 9월 1일

블로그 계속 쓰시는군요! 화이팅!

답글 달기