💡 딥다이브 주제 : 조건부 요청 헤더에 대해 나열하고 한 줄로 정의해보세요.
조건부 요청 헤더
정의
- 캐시 동작 과정에서 쓰임.
- 클라이언트가 서버로 요청을 보낼 때, 특정 조건이 충족되면 요청을 처리하도록 하는 헤더.
종류
If-Modified-Since
, If-UnModified-Since
: 검증헤더로 Last-Modified
값 사용
If-None-Match
, If-Match
: 검증헤더로 ETag
값 사용
⚙️ If-Modified-Since
실생활 예시 (교재참조)
- 상황: 사용자 B가 인스타그램에서 최근 게시된 사진들을 확인하려고 합니다.
- 문제: 사용자 B가 이미 한 번 본 사진들을 다시 로드할 때, 사진이 업데이트되지 않았다면 네트워크 자원을 낭비하는 상황이 발생할 수 있습니다.
- 목적: "If-Modified-Since" 헤더를 사용하여, 서버에서는 해당 사진이 사용자가 마지막으로 확인한 이후 변경되었는지를 검사합니다. 이를 통해 불필요한 데이터 전송을 방지하고, 네트워크 효율성을 높입니다.
동작 방법
정리
- 리소스가 마지막 수정 이후 변경되었을 때만 최신 데이터를 전송하도록 서버에 요구하는 헤더.
- 전달된
If-Modified-Since
헤더값과 로제 인스타그램 페이지의 마지막 수정 시간을 비교한다.
- 리소스가 수정된 경우 : 200 OK
+ 최신 인스타그램 페이지
- 리소스 수정안된 경우 : 304 Not Modified
(데이터는 보내지 않음.)
⚙️ If-UnModified-Since
실생활 예시
- 상황: 사용자A와 B가 동시에 같은 문서를 편집하는중.
- 문제: 사용자A가 먼저 문서를 수정 완료. 사용자B는 사용자A가 수정했음을 알지 못하고 서버에게 수정요청을 하면 B가 A의 내용을 덮어쓰는 문제가 발생.
- 목적: 데이터의 무결성을 보장하고, 두 변경 중 하나만을 수행하도록 한다.
동작 방법
정리
- 클라이언트가 서버에 요청을 보낼 때, 특정 날짜 이후로 리소스가 수정되지 않았을 경우에만 요청을 처리하도록 서버에 요구하는 헤더.
- 목적 : 리소스 수정 시 충돌 방지, 특정 시점 이후로 리소스 변경되지 않도록 할때 사용
- 서버에서 전달받은
If-Unmodified-Since
값과 리소스(문서)의 마지막 수정 시간을 비교한다.
- 리소스가 수정된 경우 : 412 Precondition Failed
상태코드 반환 → 수정할 수 없음을 알림.
- 리소스 수정안된 경우 : 200 OK
상태코드 반환 + 문서 수정
If-Modified-Since
와 If-UnModified-Since
의 단점
- 검증헤더로 날짜,시간 기반의
Last-Modified
헤더를 사용
- 1초 미만 단위로는 캐시조정 불가능
- 날짜 기반의 로직 사용
- 데이터를 수정해서 날짜는 다르지만, 데이터값은 변하지 않은경우에도 다시 한번 데이터를 받아와야 하므로 비효율적.
- 주석처럼 크게 영향이 없는 변경에서는 캐시를 유지하고 싶은 경우
Last-Modified
- 리소스가 마지막으로 수정된 시간을 나타내는 헤더
Tue, 07 Nov 2024 10:00:00 GMT
타임스탬프 형식으로 나타냄.
ETag
- 리소스의 고유 식별자나 버전을 나타내는 값
v2
, e2fc714dd94
… 해시값 또는 버전 형태로 나타냄.
⚙️ If-None-Match
- 서버의 리소스가 주어진 ETag와 일치하지 않을 경우에만 요청을 처리하도록 하는 헤더.
If-Modified-Since
와 목적은 같으나 검증헤더로 Last-Modified
가 아닌 ETag
를 쓴다는 점에서 다름.
동작 방법
- ETag가 일치하면 : 서버는
304 Not Modified
상태코드 반환
- ETag가 일치하지 않으면 :
200 OK
+ 서버는 변경된 새로운 리소스를 반환
⚙️ If-Match
- 클라이언트가 제공한 ETag와 서버의 ETag가 일치할 경우메나 요청을 처리하도록 하는 헤더.
If-UnModified-Since
와 목적은 같으나 검증헤더로 Last-Modified
가 아닌 ETag
를 쓴다는 점에서 다름.
동작 방법
- ETag가 일치하면 : 리소스를 수정하고
200 OK
응답 반환
- ETag가 일치하지 않으면 :
412 Precondition Failed
상태코드 반환, 클라이언트가 수정할 수 없도록 막음.
최종 정리
조건부 요청 헤더 : 클라이언트가 서버로 요청을 보낼 때, 특정 조건이 충족되면 요청을 처리하도록 하는 헤더.
공부한 내용을 정리한 글이라 틀린 부분이 있을 수 있습니다. 틀린 부분이 있다면 알려주시면 감사하겠습니다.