If-Match
요청 헤더 Conditional

개요

If-Match는 클라이언트가 가진 ETag가 서버의 현재 ETag와 '일치할 때만' 요청을 처리하도록 하는 조건부 요청 헤더입니다. 주로 PUT·DELETE 같은 쓰기에서 동시 수정 충돌을 막는 낙관적 잠금(optimistic locking)에 쓰입니다.

자세히

동작은 If-None-Match와 정반대입니다. 클라이언트는 리소스를 읽을 때 받은 ETag를 저장해 두었다가, 수정 요청에 If-Match로 실어 보냅니다. 서버는 이 값이 현재 ETag와 같은지 확인해, 같으면(그동안 아무도 안 바꿨으면) 수정을 진행하고, 다르면 다른 사람이 먼저 바꿨다는 뜻이므로 412 Precondition Failed로 거부합니다. 이로써 '내가 읽은 뒤 남이 덮어쓴 것을 내가 또 덮어쓰는' 로스트 업데이트를 방지합니다.

`If-Match: *`는 '리소스가 존재하기만 하면'이라는 뜻으로, 존재하지 않으면 실패합니다(update-if-exists). 이는 존재할 때만 생성하는 `If-None-Match: *`와 대칭을 이룹니다.

서버는 클라이언트가 전제조건 없이 위험한 갱신을 보내는 것을 막기 위해 428 Precondition Required로 If-Match 사용을 강제할 수 있습니다. If-Match는 정확한 일치를 위해 강한(strong) ETag 비교를 사용합니다.

문법

If-Match: <etag>[, <etag>]* | *

e.g. If-Match: "686897696a7c876b7e"

실무 참고

관련 헤더

관련 상태코드

스펙 근거