웹 재요청 방지 및 트래픽 감소를 위한 방법

  • from cache
    • 서버에 요청자체를 하지 않는다.
      • 가장 효과가 좋다.(요청 자체가 없으므로)
    • 최초 한번 데이터를 가져오면, 그 후로는 웹 브라우저의 캐시에서 데이터를 가져온다.
      즉, 서버와의 통신이 없어진다.
    • 하지만 F5를 누를 경우 새로 데이터가 전송된다.(HTTP Code 200 발생)
    • 관련 응답 해더 및 PHP 적용법 ($g는 캐시 기간(초))
      • header('Cache-Control:public, max-age='.$g); // HTTP/1.1
        • 지정 초 이전까지는 재요청하지 않도록 권장함 (새로 고침에서는 무시됨)
      • header("Expires: ".gmdate("D, d M Y H:i:s", time()+$g)." GMT"); //캐시
        • 지정 시간까지는 재요청 하지 않도록 권장함 (새로 고침에서는 무시됨)
      • apache의 경우 mod_expires 적용
  • 304 Not Modified
    • 요청은 하지만, 트래픽이 아주 적게 발생된다.(해더 전송 정도만 발생)
    • F5로 새로 요청해도 Etag나 Last-Modified의 조건에 맞으면 HTTP Code는 304가 발생된다.(실제 데이터 전송은 없음)
      (ctrl+F5의 경우 etag와 Last-Modified 가 없이 요청되므로 새로 가져온다.)
    • 관련 응답 해더 및 PHP적용법
      • header("Etag: ".$etag_key); //etag
        • 파일의 수정내역을 Etag로 만들어서 출력한다.
          클라이언트가 같은 Etag로 요청하면, 304코드를 알려준다.
        • 아파치의 경우 FileETag 부분 참고
        • 파일 수정 시간을 사용할 경우 문제가 될 수 있다.
          서버를 여러대 사용할 경우 서버 간의 파일의 시간 차가 발생될 수 있기 때문이다.
        • 여러서버를 묶어쓰는(L4에 연결 해서) 경우 사용안하는게 좋다
        • PHP에서 처리할 경우 요청에서 HTTP_IF_NONE_MATCH 관련 처리가 필요
      • header('Last-Modified: '.gmdate("D, d M Y H:i:s", time()+$g)." GMT");
        • 지정 시간까지는 파일이 수정되지 않는다는 것을 나타낸다.
          즉, 그 시간에 재요청해봤자 304 코드가 반환된다.
        • apache의 경우 mod_expires 적용
        • PHP에서 처리할 경우 요청에서 HTTP_IF_MODIFIED_SINCE 관련 처리가 필요

# 참고
# 브라우저 동작에 따른 동작 설명 (크롬에서 테스트하였음)
  • 브라우저 링크로 페이지 이동
    • Cache-Control, Expires 적용됨 (from cache 발생 할 수 있음)
    • Etag, Last-Modified 를 적용해서 재 요청됨.(즉, 304 발생 할 수 있음)
  • 브라우저에서 F5를 누를 경우
    • Cache-Control, Expires 무시됨 (새로 받음)
    • Etag, Last-Modified 를 적용해서 재 요청됨.(즉, 304 발생 할 수 있음)
  • 브라우저에서 ctrl+F5를 누를 경우
    • Cache-Control, Expires 무시됨 (새로 받음)
    • Etag, Last-Modified 를 무시하면서 재 요청됨.(완벽한 새로 고침)

# PHP에서 Etag 상세
$etag_key = 'AAAAA' //ETAG 알아서 만들어라...보통 파일크기, 파일 수정일을 사용해서 만든다.

if(isset($_SERVER['HTTP_IF_NONE_MATCH'][0]) && trim($_SERVER['HTTP_IF_NONE_MATCH'])==$etag_key){
header("HTTP/1.1 304 Not Modified",true,304); 
exit();
}else{
header("Etag: ".$etag_key); //etag
}

# PHP에서 Last-Modified 상세
$g는 처리하고픈 기간(초)

if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'][0]) &&  strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) < time()){
header("HTTP/1.1 304 Not Modified",true,304); 
exit();
}else{
header('Last-Modified: '.gmdate("D, d M Y H:i:s", time()+$g)." GMT");
}


댓글
  • No Nickname
    No Comment
  • 권한이 없습니다.
    {{m_row.m_nick}}
    -
목록형 📷 갤러리형
제목
[기본형] HTML (with 부트스트랩5.3 , jquery 3.7, vue.js)
유용한 리눅스(LINUX) 명령어
[공지] 기술 게시판
4.28
4.29
4.30
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
5.11
5.12
5.13
5.14
5.15
5.16
5.17
5.18
5.19
5.20
5.21
5.22
5.23
5.24
5.25
5.26
5.27
5.28
5.29
5.30
5.31
6.1