웹모아
웹모아[가입] 로그인 / 회원가입   검색     


  
환경설정
 

POST로 값을 넘길때, 만료된 페이지입니다 문제의 원인과 해결법.
2007-08-27 14:24:03 댓글:(0)   조회:3833
 

일단, HTTP에 전송 방식(METHOD)에 대한 이야기부터 하겠습니다. 
일반적으로 PHP에서 많이 쓰이는 HTTP 전송 방식은 GET 방식과 POST 방식이 있습니다. (실제로는 이 두개 말고도 많이 있습니다. 안쓰이는 것 뿐이지요.) 이 두 방식의 차이를 우선 아셔야 하겠습니다. (자세하게 알고 싶은 분은 RFC-2616 : HTTP/1.1을 읽어보십시오) 

: GET 방식 : 
example.php?var1=value1&var2=value2 와 같은 방식입니다. 일반적인 HTTP 호출은 모두 GET 방식으로 이루어집니다. (변수 넘기지 않는 일반 호출도 GET 입니다) GET 이라는 의미 그대로, 그 파일을 그대로 가져오는겁니다. 물론, PHP라면 변수를 받아서 조작이 가능하지요. 사용이 간편하다는 장점이 있습니다. 단점은, 첫쨰, 길이 제한이 있습니다. 넘길 수 있는건 http:// 부터 시작해서, 최대 255자입니다. (변수부분만 255자가 아닙니다) 두번째, 넘어가는 변수가 주소줄에 그대로 노출됩니다. 다른사람에게 보여줘서는 안되는 것을 넘기면 유출될 위험이 크지요. (예: 패스워드 등) 

: POST 방식 : 
일반적으로 HTML의 FORM을 이용해서 넘기는 방식입니다. (FORM 태그에서 method="POST"로 지정하는게 POST 방식을 이용하라는 의미입니다. - 지정 안하면 GET으로 넘어가지요) 이 방식은 서버에 값을 넘기기 위해 만들어진 방식입니다. GET 방식과 다르게 밖으로 보여지지 않으며, 길이에도 제한이 없습니다(규격상으로는). 

* '만료된 페이지입니다.' 문제의 원인 


만료된 페이지의 문제는 POST에서만 나타나게 됩니다. 원인은 POST 방식의 작동 원리에 있습니다. POST는 서버에 값을 넘겨서, 서버쪽에 영향을 미치게 하는 것을 목적으로 합니다. 그러므로 한번 값이 넘긴 뒤에, 그 페이지를 다시 읽으려고 하면 브라우저는 이미 서버쪽에서 처리가 끝났을것이라 생각하고, 다시 값을 보내지 않기 위해서 만료된 페이지 오류를 내보내게 됩니다. (이건 브라우저에서 내보내는 겁니다. 서버랑은 전혀 관계가 없지요. 서버는 POST 전송이 100번 오면 그냥 100번 다 처리합니다) 예를 들어서 설명하면, 게시판에 글을 씁니다. 글을 저장하고 표시해주는 페이지로 이동하겠지요? 그리고 그 페이지를 리로드 하게 되면, 계속해서 글을 저장하라는 전송을 하게 됩니다. 신용카드 결제 등의 폼에서도 이런 일이 일어날수 있습니다. 그래서 브라우저에서는 한번 POST로 전송하면 그 페이지를 다시 사용하지 못하도록 하는 겁니다. 

* 해결법 
다른 방법도 있을 수 있겠습니다만, 제가 쓰는 방법을 소개하도록 하겠습니다. 참고로, 이 방법은 제가 예전에 PURE LIFE DREAM(펄로 제작된 방명록 스크립트입니다)을 분석해서 얻어낸 방법입니다. 
중요한 포인트는 처리하는 부분과, 출력하는 부분을 따로 만드는 것입니다. 그리고 HTTP의 헤더만을 이용해서 페이지의 움직임을 처리해주는 것이지요. 
일단, 폼에서 action은 처리부 스크립트로 연결을 합니다. 값이 POST 방식으로 처리부로 넘어갑니다. 자, 넘어온 값에 맞게 처리합니다. (파일을 가공하던, DB를 업데이트 하건...) 그리고 처리부에서 출력해야할건 header("Location: ");을 이용해서 출력부로 연결해주는 헤더 뿐입니다. (브라우저 캐쉬 없애는 헤더도 넣어주면 더 좋습니다) HTTP 헤더의 Location이 사용자에게 전송이 됩니다. 브라우저가 이해합니다. 아, 이 페이지는 Location에 지정된 페이지로 연결되는구나! 그리고 **GET 방식**을 통해서 Location에 지정된 파일을 가져옵니다. 

오류가 나오는 페이지와 바뀐 점은 무엇일까요? POST 방식으로 호출한 정보가 히스토리에 남아있지 않습니다. 그러므로 POST 전송이 완료된 페이지는 다시 보여주는 일이 없습니다. 



정리해서 그림(?)으로 보여드리겠습니다 (제가 워낙 설명을 못해서) 

문제가 발생하는 상황 
1. 브라우저 ------ POST (값 넘어감) -------------> 서버 
2. 서버(처리) -----------------------------------> 브라우저 (출력) 

이후 리로드를 하면, 브라우저에서는 POST를 했으므로 다시 POST를 못하게 오류 출력. 

해결법 적용 
1. 브라우저 ------ POST (값 넘어감) -------------> 서버의 처리 파일 
2. 서버의 처리파일 --------- HTTP 헤더 Location 전송 -----------> 브라우저 
3. 브라우저 ------ GET으로 Location의 파일을 달라고 함 -------> 서버의 출력 파일 
4. 서버의 출력 파일 ---------------------> 브라우저 (출력) 

이후 리로드를 하면, GET 방식으로 가져온 파일이므로 리로드함. 

온라인상에서 작성해서 별로 글이 깔끔하지 못합니다. 이해하고 봐주시길. 
그리고 다른 해결법 있으면 소개 부탁드립니다. ^^
. 


[이전글]  2차 도메인과의 세션고유
[다음글]  세션(로그인)시간 무한대로 늘리기 초간단 초보용


 
댓글쓰기는 회원(로그인 하신분) 이상 가능합니다.


 댓글 (0)

  
환경설정
페이지: 1 / 5   

 PHP.INI에서의 세션 관련 설정
열람:9492   2016.07.04


 [PHP] $_SERVER
열람:4239   2016.06.12


 php 에서 세션시간설정
열람:2111   2011.04.20


 업로드 용량과 관련한 php.ini 파일 설정
열람:2676   2010.04.29


 mbstring - PHP 확장모듈을 추가하는 방법
열람:2212   2008.02.22


   [RE] mbstring - PHP 확장모듈을 추가하는 방법
열람:2160   2008.02.22


 타도메인간 쿠키 공유하기
열람:2311   2007.10.27


 home 데이타 백업 스크립트
열람:1942   2007.10.24


 cron 이용 일정시간마다 php문실행
열람:2911   2007.10.24


 cron, crontab, PHP 소스 자동실행, 쉘 스크립트
열람:2363   2007.10.24



[1]  [2]  [3]  [4]  [5]  

복수단어 검색은 공백(space)로 구분해 주세요.




 
최근 글 [손님]
 
인기 글 [손님]
[깊은연못] 24시간 Classical Radio
[기무진선] 모의고사질문이요