HTTP/HTTP 헤더

HTTP 프로토콜 If-None-Match 헤더

hippo 데브옵스 2022. 6. 25. 16:14
  • If-None-Match 헤더는 If-Match 헤더와 비슷하지만 GET 방식에 있어서 차이가 있음
  • If-None-Match 헤더는 GET에서는 If-Modified-Since 헤더처럼 사용
  • If-None-Match 헤더를 이용해서 컨텐츠의 변경여부를 묻고 컨텐츠가 변경되지 않는 경우(기존 컨텐츠의 ETage정보가 요청의 If-None-Match 헤더의 ETag와 같다면) "304 Not Modified" 메시지를 전달


If-None-Match 헤더의 동작흐름

1. 먼저 GET으로 최초 이미지 컨텐츠를 요청한 후 ETag 정보를 받음

$ curl -H "Accept: application/json" -i http://localhost:8080/spring-boot-rest/foos/1
HTTP/1.1 200 OK
ETag: "f88dd058fe004909615a64f01be66a7"
Content-Type: application/json;charset=UTF-8
Content-Length: 52



2. 클라이언트가 If-None-Match 헤더에 동일한 ETag 를 전달하는 경우와 그렇지 않은 경우를 확인

  • 웹서버는 If-None-Match 헤더의 값이 같은 경우 304 상태 코드를 반환 → 정상 응답 코드

  • 웹서버는 If-None-Match 헤더의 값이 다른 경우 200 상태코드를 반환 → 정상 응답 코드

  • GET에서는 If-None-Match의 값이 ETag와 같을 경우 캐싱되어 있는 이미지를 사용할 수 있도록 304 상태코드를 반환

  • If-None-Match 헤더는 If-Modified-Since 헤더와 같은 목적으로 사용

    ## 확인한 ETag와 If-None-Match 헤더의 ETag가 동일한 경우
    $ curl -H "Accept: application/json" -H 'If-None-Match: "f88dd058fe004909615a64f01be66a7" -i http://localhost:8080/spring-boot-rest/foos/1
    HTTP/1.1 304 Not Modified
    ETag: "f88dd058fe004909615a64f01be66a7"
    
    ## 확인한 ETag와 If-None-Match 헤더의 ETag가 다른 경우
    $ curl -H "Content-Type: application/json" -i -X PUT --data '{ "id":1, "name":"Transformers2"}' http://localhost:8080/spring-boot-rest/foos/1
    HTTP/1.1 200 OK
    ETag: "d41d8cd98f00b204e9800998ecf8427e"
    Content-Length: 0


If-None-Match 헤더와 If-Modified-Since 헤더의 차이

  • If-Modified-Since 헤더는 시간 정보를 담기 때문에 웹서버나 클라이언트의 환경적인 측면에서 정보의 정확성이 보장 X
  • If-None-Match 헤더는 ETag 정보를 활용하기 때문에 컨텐츠의 변경 유무를 아주 정확하게 반영 가능


If-None-Match 헤더와 If-Match 헤더의 차이

  • If-Match 헤더는 PUT과 같이 덮어쓰기 위한 동작에 사용 → 새로운 파일 생성을 금지
  • If-None-Match 헤더는 신규로 생성하기 위한 동작에 사용 → 파일 덮어쓰기를 금지하는 컨셉