본문 바로가기

CGI (PHP, ... )

폼 내용 유지와 관련하여 session_cache_limiter() 에 대해 잘못 알려진 내용


폼 내용 유지와 관련하여 session_cache_limiter() 에 대해 잘못 알려진 내용

history.back() 했을 때 폼의 내용을 유지하는 문제와 관련해서
session_cache_limiter("nocache, must-revalidate");
라는 게 자꾸 올라오는데요, 잘못된 글이 자꾸 퍼져나가는 것 같아 씁니다.
(Tip & Tech에 올리는 게 좀 부적당한 것 같기도 하지만;;; 양해해주셔요.)

우선 HTTP 1.1 RFC 중 한 가지만 보죠.

cache-response-directive =
"public"
| "private" [ "=" <"> 1#field-name <"> ]
| "no-cache" [ "=" <"> 1#field-name <"> ]
| "no-store"
| "no-transform"
| "must-revalidate"
| "proxy-revalidate"
| "max-age" "=" delta-seconds
| "s-maxage" "=" delta-seconds
| cache-extension

여기서 no-cache는 말 그대로 캐시하지 말라는 것이므로
브라우저에서 페이지 저장하지 말라는 거고요,
must-revalidate는 멋대로 하지 말고 확인하라는 거죠.
(정확한 역할은 RFC를 찾아 읽어보세요. 강추!)
그러니까 "nocache, must-revalidate"는
원래 "캐시를 절대 하지 마라!" 라는 뜻입니다.

그러니까 이렇게 넣어놓고 "우아~ 폼 내용이 안 사라지네!"라고 하는 건
눈 감고 Copy & Paste 혹은 개그콘서트인 겁니다. ㅡ.ㅡ;
왜 history.back() 해도 폼이 유지되는 걸까? 하고
의문을 가져보지 않으셨나요?



<?php
session_cache_limiter("nocache");
session_start();
?>

위와 같은 파일 하나 만들어서 Response Header 가 어떻게 나오는지 살펴보세요.
살펴보는 방법 중 하나는 간단하게... Linux 쉘에서...

/usr/bin/wget -d -O /dev/null "http://kr.yahoo.com/"

실제 어떻게 나오는지는 직접 확인해보세요.
남의 글 백번 보는 것보다 직접 한번 해보는 게 낫습니다.
자, 눈에 띄는 게 있나요? 없나요? ;;;



이번엔 아무 것도 없는 문자열만 넣어서 확인해보죠.

<?php
session_cache_limiter("");
session_start();
?>

Cache-Control과 관련된 것은 안 나올 겁니다.



이번엔 nocache, must-revalidate를 넣어서
위와 같은 방법으로 확인해보세요.

<?php
session_cache_limiter("nocache, must-revalidate");
session_start();
?>

뭔가 좀 이상한 거 없습니까?
그렇습니다. ""랑 똑같이 Cache-Control 과 관련된 것은 안 나옵니다.
왜 그럴까요? 왜 그럴까요? 알~아~맞~추~어 봅시다. ㅡoㅡ;;;


PHP에서 session_cache_limiter()에 쓸 수 있는 것은
public, private, no-cache 뿐입니다.
(Ver. 4.2.0부터 private와 유사한 private_no_expire 추가되었음.)
http://kr.php.net/manual/en/function.session-cache-limiter.php
그 외에는 어떤 걸 넣든 Cache-Control를 포함하지 않습니다.
그러니까 "" = "nocache, must-revalidate" = "Fencer" = "phpschool"
Response Header에 Cache-Control이 없으면
캐시에 관한 한(!) 세션을 쓰지 않을 때와 같다고 보아도 무방합니다.
즉, 일반 HTML 문서와 별 차이가 안 납니다.




왜 선택할 수 있는 게 이렇게 적은 거지? 라고 의문을 갖는다면
PHP session 부분의 C 소스를 보면 확실합니다.
어떻게 보면 이런 제한 때문에 쉽기도 하고
동시에 자유롭고 세밀한 제어가 힘들기도 하죠.
(필요한 사람은 C 소스를 수정하여 컴파일하면 되겠죠.)

처음에 누군가 확인도 해보지 않고
session_cache_limiter("nocache, must-revalidate"); 를 넣으세요~
하니까 확인도 되지 않은 채 여기저기 퍼져나간 것 같은데요...
[결론] 세상에 믿을 놈 하나 없습니다. ㅡ_ㅡ;;;
물론 제가 뻥 치는 것일 수도 있으니까 위에 적은 거 직접 확인해보세요.

※ 참고하면 좋을 문서. http://www.faqs.org/rfcs/rfc3143.html 

출처 - phpschool.com 게시판에서 어느 무명의 팁 -