HTTP/HTTP 헤더
HTTP 프로토콜 If-Match 헤더
hippo 데브옵스
2022. 6. 25. 15:32
- If-Match 헤더를 이해하기 위해서는 ETag 헤더를 먼저 이해하는 것이 좋음
- ETag 헤더 → 웹서버가 제공하는 컨텐츠들에 각각 부여되는 일종의 식별자 같은 정보
- 웹서버는 클라이언트에게 컨텐츠를 제공할때 ETag 정보를 같이 전달
- 클라이언트와 프록시서버들은 웹 서버에게 전달받은 ETag 정보를 다음 요청(subsequence Request)에 활용 가능
- 캐시기능에서 ETag를 활용 → 사용자가 요청한 컨텐츠가 이전에 제공했던 컨텐츠인지 새롭게 제공해야 할 컨텐츠인지 구별 가능
- If-Match 헤더는 요청 헤더의 한 종류이고 헤더 값(Value)으로 서버에서 제공해준 ETag 정보를 표기
- 저장된 리소스가 주어진 ETags의 하나와 일치하는 경우에만 요청을 조건부로 만들고 메소드를 적용
- 웹서버가 가지고 있는 컨텐츠 별로 ETag 정보를 부여하여 관리하게 되는데, 컨텐츠의 변경시 동시 작업의 경우 컨텐츠 무결성이 훼손 가능 → 컨텐츠 무결성 훼손을 방지하기 위해 If-Match 헤더를 사용
"nature.jpg"라는 자연 이미지 파일 하나가 있다고 가정
- 아래의 파일 이름(nature.jpg)은 같지만, 내용이 다르기 때문에 웹서버는 이를 구분해야 할때 ETag 정보를 활용 가능
- 여름은 여름에 맞는 이미지를 서비스 컨텐츠고 제공해야함
- 여름의 이미지는 겨울에 사용할 수 없기에, 겨울 이미지에 맞도록 변경
If-Match 헤더의 동작 흐름
1. 클라이언트 A와 클라이언트 B가 서버에게 전달받은 이미지는 같은 것이므로, ETag 정보도 같음 → 둘 다 ETag를 AABB로 가정
- 클라이언트 A가 특정 컨텐츠(자연 이미지->여름)를 요청
- 서버는 자연 이미지를 클라이언트 A에게 ETag 정보와 함께 정상적으로 전송
- 클라이언트 B가 같은 이미지를 요청
- 서버는 클라이언트 A에게 제공했던 같은 이미지를 B에게도 ETag 정보와 함께 전달
- 클라이언트 A와 클라이언트 B가 서버에게 전달받은 내용은 같기때문에 같은 ETag 정보도 가지고 있음
2. 클라이언트 A가 겨울복장의 트와이스 이미지로 변경한 이후, 클라이언트 B가 ETag AABB 이미지를 변경 요청
- 클라이언트 A가 PUT 요청방식(Method)를 이용하여 자연 이미지를 여름에서 겨울로 변경
- 클라이언트 A가 이미지를 변경하였기에 서버가 기존에 가지고 있는 이미지의 ETag와 다른 Etag가 저장
- 서버는 컨텐츠 이미지가 변경되었으므로 더이상 AABB 의 Etag 정보를 가진 컨텐츠를 제공 X
- 클라이언트 B가 클라이언트 A가 작업을 한지 모르고 PUT 방식을 이용하여 이미지 변경 요청 → ETag AABB 이미지 변경 요청
- 웹서버는 클라이언트 B가 전달해 준 ETag 정보(여름의 자연 이미지)와 다르기 때문에 실패라는 메시지를 클라이언트 B에게 전송
3. If-Match 헤더의 값으로 *(asterisk)" 를 사용
- 컨텐츠의 내용은 모르지만 파일이 존재하는 경우, 클라이언트의 요청을 서버에서 처리할 수 있음
- 클라이언트 B가 If-Match 의 값으로 특정 파일의 ETag AABB가 아닌 *(asterisk)를 사용했다면, 클라이언트 A가 이미 변경했음에도 불구하고 클라이언트 B가 요청한 이미지 변경 동작이 처리
- If-Match 헤더에 *(asterisk)를 사용하면 파일 검증없이 변경이 됨으로 위험함 → 주의해서 사용해야함
문법
If-Match: <etag_value>
If-Match: <etag_value>, <etag_value>, …
지시자
1. <etag_value>
- 요청된 리소스를 고유하게 나타내는 엔터티 태그
- 큰따옴표(예: "675af34563dc-tr34") 사이에 배치된 ASCII 문자 문자열
- W/"약함"을 나타내기 위해 접두사를 사용 가능
- 리소스를 의미론적으로 나타내지만 바이트 단위로 나타내지 않음
- If-Match 헤더에서 약한 엔터티 태그는 일치 X
2. * (asterisk)
- 별표는 모든 리소스를 나타내는 특수 값
3. If-Match 헤더 사용 예시
If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
If-Match: "67ab43", "54ed21", "7892dd"
If-Match: *
※ 이미지 제공 : https://papers.co