본문 바로가기
아직 카테고리 미정

HTTP 304 Not Modified의 이해 및 예제(with. spring)

by simplify-len 2020. 11. 14.

1. HTTP 상태 코드

1.1 응답 메시지 & 상태라인

After receiving and interpreting a request message, a server responds with an HTTP response message.

요청 메시지를 받고 해석한 뒤에, 서버는 HTTP 응답 메시지를 보낸다.

Example:

HTTP/1.1 304 Not Modified
Date: Fri, 07 Sep 2012 14:51:43 GMT
Server: Apache/2.2.22 (Win32) mod_jk/1.2.37
Connection: Keep-Alive
Keep-Alive: timeout=5, max=94
ETag: "d00000001f216-1e7-4c908f1fc4d6e"

응답코드

The first line of a Response message is the Status-Line, consisting of the protocol version followed by a numeric status code and its associated textual phrase, with each element separated by SP characters. No CR or LF is allowed except in the final CRLF sequence.
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

1.2 상태코드란?

상태코드는 세자리 숫자 결과코드로 요청에 대한 응답값 상태를 이해하고 만족하기 위해 사용됩니다.

The Status-Code element is a 3-digit integer result code of the attempt to understand and satisfy the request.

1.3 상태 코드의 분류

  • 1xx: Informational - Request received, continuing process
    정보 - 요청을 받음, 계속 진행
  • 2xx: Success - The action was successfully received, understood, and accepted
    성공 - 서버가 요청을 성공적으로 처리했음
  • 3xx: Redirection - Further action must be taken in order to complete the request
    리다이렉션 - 요청이 완수되기 위해서 추가적인 동작이 이뤄져야 함
  • 4xx: client Error - The request contains bad syntax or cannot be fulfilled
    클라이언트 에러 - 요청에 잘못된 문법이 포함되었거나 제대로 만족시키지 못함
  • 5xx: Server Error - The server failed to fulfill an apparently valid request
    서버 에러 - 서버가 유효한 요청을 수행하는데 실패했음

3xx 상태 코드란?

개별적인 상태코드는 HTTP/1.1 에 정의되어 있지만 프로토콜에 영향을 주는 않는 논리적인 위치에서는 변경가능하다.

The individual values of the numeric status codes defined for HTTP/1.1, and an example set of corresponding Reason-Phrase's, are presented below. The reason phrases listed here are only recommendations – they MAY be replaced by local equivalents without affecting the protocol.

> 3xx: Redirection - 요청이 완수되기 위해서 추가적인 동작이 이뤄져야 한다.

  • 300 : Multiple Choices
  • 301 : Moved Permanently
  • 302 : Found
  • 303 : See Other
  • 304 : Not Modified
  • 305 : Use Proxy
  • 307 : Temporary Redirect

2. 304 Not Modified

2.1 Conditional GET Request

HTTP Get의 특별한 타입으로 요청 메시지에 다음 필드가 있다면 HTTP Conditional Get으로 변경한다.

  • If-Modified-Since
  • If-Unmodified-Since
  • If-Match
  • If-None-Match
  • If-Range header fields

※ 대부분의 브라우저는 HTTP conditional request를 사용하여 자동 캐시 기능을 지원한다.

2.2 304 응답

클라이언트가 조건부 GET 요청을 실행하고 접근이 허용되었지만 문서가 수정되지 않았다면, 서버는 304 상태코드로 응답한다. 304응답은 메시지-바디 를 절대 포함하면 안된다. 그리고 이것은 항상 헤더 필드후에 처음 공백라인으로 종료된다.

If the client has performed a conditional GET request and access is allowed, but the document has not been modified, the server SHOULD respond with this status code. The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields.

만약 304 응답이 현재 캐시되지 않은 엔티티를 지시하면, 캐쉬는 반드시 이 응답을 무시하고 조건없는 요청을 반복해야 한다.

If a 304 response indicates an entity not currently cached, then the cache MUST disregard the response and repeat the request without the conditional.

 

3. 304 응답 테스트

요청 테스트

Spring MVC에서 Last-modified 와 if-Modiied-Since 헤더를 통한 캐싱방법은 아래와 같습니다.

1. 브라우저에서 필요한 리소스를 최초로 요청합니다.

2. 서버에서 응답헤더에 Last-Modified 헤더를 셋팅하여 요청한 리소스와 함께 내려보내면, 브라우저의 해당 리소스의 복사본을 생성항 저장한다.

3. 브라우저에서 해당 리소스를 재요청한 경우에는 서버에서 Last-Modified 헤더에 설정한 값을 If-modified-Since 헤더에 포함시켜 서버에 요청한다.

4. 서버에서는 If-Modified-Since 헤더 값을 통해 해당 리소스가 변경되었으면 Last-Modified 헤더에 최신 수정날짜를 설정하여 파일을 전달합니다. 변경되지 않았을 경우 304 HTTP 상태코드로 응답하면 브라우저는 기존에 저장한 값을 재사용하게 됩니다.

첫 요청시 데이터를 아래 헤더와 함께 보여줍니다

한번더 요청하게 되면?

304 HTTP CODE가 내려오게 됩니다.

 

4번에서 말한 것처럼 첫번째 요청시 Last-Modified 헤더에 해당 파일의 최근 수정일이 설정해 내려집니다.

2번째 요청시, If-Modified-Since 응답값에 첫번째 요청의 Last-Modified가 설정되고 Reponse에 Last-Modified가 동일할 경우 304 HTTP CODE를 내려줍니다.

이때 브라우저는 로컬에 캐싱해둔 파일을 재사용하게 됩니다.

그외 ServletWebRequest의 경우에는

boolean checkNotModified(long lastModifiedTimestamp);

를 활용하는데, 이는 아래 링크를 참조하시면 됩니다.

참고자료

https://itstory.tk/entry/Spring-MVC-LastModified-IfModifiedSince-캐시-설정

 

Spring MVC Last-Modified, If-Modified-Since 캐시 설정

Spring MVC에서 Last-Modified와 If-Modified-Since 헤더를 통한 캐싱방법을 살펴보겠습니다. 웹 캐싱에 대한 이론적인 부분과 종류들은 다른 설명 글들이 많기 때문에 자세한 내용은 생략하도록 하겠습니

itstory.tk

wiki.gurubee.net/pages/viewpage.action?pageId=26739910

 

HTTP 304 Not Modified의 이해 및 예제 - [종료]구루비 Dev 스터디 - 개발자, DBA가 함께 만들어가는 구루

1. HTTP 상태코드 1.1 응답 메시지 & 상태라인 After receiving and interpreting a request message, a server responds with an HTTP response message. 요청 메시지를 받고 해석한 뒤에, 서버는 HTTP 응답 메시지를 보낸다. Example

wiki.gurubee.net

댓글