HTTPQUERY
한국어

If-Match

사용법

If-Match 헤더는 ETag 값을 비교하여 조건부 요청을 가능하게 합니다. 클라이언트는 리소스의 현재 엔티티 태그가 나열된 값 중 하나와 일치할 때만 서버가 요청을 처리하도록 이 헤더를 포함시킵니다.

GET이나 HEAD 같은 안전한 메서드에서 If-Match 헤더는 응답을 엔티티 태그가 일치하는 리소스로 제한합니다. 이는 캐시를 검증하는 것이 아니라 특정 표현을 선택하는 것입니다(캐시 검증에는 대신 If-None-Match를 사용합니다).

PUT, DELETE 같은 상태 변경 메서드에서 If-Match 헤더는 업데이트 유실 문제를 방지합니다. 두 클라이언트가 같은 리소스를 가져와 각자 사본을 수정하고 다시 쓰기를 시도할 때, If-Match 헤더는 첫 번째 쓰기만 성공하도록 보장합니다. 첫 번째 쓰기 이후 ETag가 바뀌었기 때문에 두 번째 쓰기는 412 Precondition Failed로 실패합니다.

이 패턴은 낙관적 동시성 제어로 알려져 있습니다. 클라이언트는 리소스와 그 ETag를 읽고 로컬에서 변경한 뒤, If-Match에 원래 ETag를 설정하여 업데이트를 제출합니다. 서버는 그동안 리소스가 변경되지 않았음을 확인한 뒤 업데이트를 적용합니다.

If-Match 헤더는 강한 비교만 수행합니다. 약한 엔티티 태그(W/ 접두사가 붙은 것)는 불투명 값이 동일하더라도 일치하지 않습니다. 이 엄격한 동작은 리소스의 바이트 수준 동등성을 보장합니다.

엔티티 태그 목록

큰따옴표로 감싸고 쉼표로 구분한 하나 이상의 ETag 값입니다. 서버는 각 값을 리소스의 현재 엔티티 태그와 대조합니다.

와일드카드 (*)

별표 *는 리소스의 현재 표현 아무것에나 일치합니다. 이 형태는 엔티티 태그 값과 무관하게 대상 리소스가 존재하기만 하면 성공합니다. * 값은 대상 URI에 이미 리소스가 있을 때 PUT이 새 리소스를 만드는 것을 막기 위해 흔히 사용됩니다.

예시

클라이언트가 리소스를 갱신하기 위해 PUT 요청을 보냅니다. If-Match 헤더는 원래 GET 응답에서 받은 ETag를 담고 있습니다. 서버는 ETag가 여전히 일치할 때만 업데이트를 적용합니다.

PUT /document/42 HTTP/1.1
Host: api.example.re
Content-Type: application/json
If-Match: "a1b2c3d4"

{"title": "Updated Document"}

다른 클라이언트가 리소스를 수정했다면 ETag는 더 이상 일치하지 않습니다. 서버는 412 Precondition Failed로 응답하며 업데이트를 거부합니다.

HTTP/1.1 412 Precondition Failed
Content-Type: application/json
ETag: "e5f6g7h8"

여러 엔티티 태그는 쉼표로 구분된 값으로 나열합니다. 나열된 값 중 하나라도 리소스의 현재 ETag와 일치하면 조건이 성공합니다.

If-Match: "a1b2c3d4", "x9y8z7w6"

와일드카드 형태는 리소스가 존재할 때 성공합니다. 이는 PUT이 실수로 새 리소스를 생성하는 것을 막아 줍니다.

If-Match: *