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

  • 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}}
    -
제목 작성자 날짜
공대여자
공대여자
mins01
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자