HTTP 메시지는 웹 상에서 클라이언트와 서버 간에 데이터를 교환하기 위해 사용되는 메시지 포맷입니다. HTTP 메시지는 크게 두 가지로 나뉩니다.
HTTP 메시지는 다음과 같은 기본 구조로 이루어져 있습니다.
HTTP 메서드는 클라이언트가 서버에 어떤 동작을 요청하는지를 정의
GET
서버로부터 자원을 요청하는 메서드로 주로 데이터 조회에 사용되며, 요청 본문이 없다
POST
서버로 데이터를 전송하고, 그 데이터를 처리하도록 요청하는 메서드로 주로 자원 생성이나 데이터 처리를 위해 사용
PUT
서버의 자원을 덮어쓰는 메서드로 자원이 존재하지 않으면 새로 생성하기도 한다
PATCH
자원의 일부를 수정하는 메서드
DELETE
서버에서 자원을 삭제하는 메서드
HTTP 상태 코드는 서버가 클라이언트의 요청을 처리한 결과를 나타낸다. 5가지의 범주로 나타낸다
1XX(정보)
요청이 수신되었으며, 처리가 계속 진행됨을 나타낸다
2XX(성공)
요청이 성공적으로 처리되었음을 나타낸다
3XX(리다이렉션)
클라이언트가 요청한 리소스가 다른 위치로 이동되었음을 나타낸다
4XX(클라이언트 오류)
클라이언트의 잘못된 요청으로 인해 오류가 발생함을 나타낸다
5XX(서버 오류)
서버에서 요청을 처리하는 도중 오류가 발생했음을 나타낸다
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 헤더는 헤더 필드라고 불리며, 각 필드는 이름과 값으로 구성된다. 일반 적으로 다음과 같은 형식으로 구성된다.
header-field = field name ":" field-value
이 형식은 HTTP 메시지의 전송 시 필요한 추가 정보를 제공한다.
HTTP 헤더에는 다양한 필드가 있으며, 그 중 자주 사용되는 헤더 필드는 아래와 같다.
요청(Request) 관련 헤더 필드
응답(Response) 관련 헤더 필드
대표적인 헤더 필드 예시
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
리다이렉션 시 이동할 경로이다.
Content-Type
요청 또는 응답에서 사용되는 콘텐츠의 유형을 나타낸다.
- text/html; charset=utf-8: HTML 문서로, UTF-8 인코딩을 사용합니다.
- application/json: JSON 형식의 데이터를 사용합니다.
- image/png: PNG 이미지 파일입니다.
Content-Encoding
콘텐츠의 인코딩 및 압축 방식을 나타낸다
Content-Length
콘텐츠의 길이를 바이트 단위로 나타낸다
Content-Language
콘텐츠의 언어를 나타낸다
캐시는 네트워크에서 자원의 사본을 임시 저장하는 기술이다. HTTP 프로토콜은 기본적으로 상태를 유지하지 않는 무상태 프로토콜이기 때문에, 동일한 자원에 대한 요청이 반복될 경우 서버는 매번 자원을 새롭게 응답해야한다. 이를 보완하기 위해 캐시가 사용된다.
캐시된 자원은 다음과 같은 위치에 저장될 수 있다.
캐시의 동작을 제어하기 위해 Cache-Control
헤더가 사용된다. 이 헤더는 캐시의 사용 여부와 조건을 명시한다.
캐시된 자원은 무한히 유효하지 않으며, 일정 기간 동안만 유효하다. 자원의 마지막 변경 시점을 나타내는 Last-Modified 헤더가 이를 관리하는 데 사용된다.
캐시된 자원이 변경된 경우, 클라이언트는 이를 인지하고 새로운 자원을 받아야 한다. 자원의 변경 여부를 확인하는 두 가지 주요 방법이 있다.
If-Modified-Since 헤더
클라이언트는 요청 시 If-Modified-Since 헤더를 사용하여 특정 시점 이후 자원이 변경되었는지를 서버에 묻는다. 만약 자원이 변경되지 않았다면 서버는 304 응답을 보내며 이는 클라이언트가 캐시된 자원을 그대로 사용할 수 있음을 나타낸다.
ETag(Entity Tag)
서버는 자원에 대해 고유한 식별자인 ETag값을 부여한다. 클라이언트는 이후 요청에서 If-None-Match 헤더를 통해 이 ETag값이 변경되었는지 확인할 수 있다.
쿠키는 서버에서 클라이언트로 전송된 정보를 임시로 저장하는 작은 데이터 조각이다. 쿠키는 이름=값
의 형태로 저장되며, 주로 세션 유지, 사용자 추적, 사용자 설정 저장 등의 목적으로 사용된다. 쿠키는 다음과 같은 특징을 가지고 있다.
서버는 Set-Cookie 헤더를 통해 쿠키를 클라이언트로 전송된다. 클라이언트는 이 쿠키를 저장하고, 이후 해당 도메인으로의 요청 시 Cookie 헤더에 쿠키를 포함시켜 서버로 전송한다. 이를 통해 서버는 클라이언트를 식별하고 이전 상태를 유지할 수 있다.
Set-Cookie: domain=example.com
으로 설정된 쿠키는 example.com
과 그 하위 도메인에서 사용된다.Set-Cookie: path=/posts
로 설정된 쿠키는 /posts
경로 및 그 하위 경로에서만 유효하다쿠키의 유효 기간은 다음과 같은 두 가지 방법으로 설정된다.
Set-Cookie: expires=Wed, 10 Aug 2023 12:00:00 GMT
와 같이 특정 만료일을 설정합니다.Set-Cookie: max-age=1000
과 같이 설정된 초 단위로 쿠키의 수명을 지정할 수 있습니다. 이 예에서는 쿠키가 1000초 동안 유효합니다.쿠키는 민감한 정보를 저장할 수 있으므로 보안에 대한 주의가 필요하다.
쿠키와 세션은 사용자 상태를 유지하는 두 가지 방법이다.
블로그 계속 쓰시는군요! 화이팅!