웹모아
웹모아[손님] 검색   로그인    


 
환경설정
 


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


일단, 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 방식으로 가져온 파일이므로 리로드함. 

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



 댓글 (0)


환경설정
페이지: 1 / 2   


     PHP.INI에서의 세션 관련 설정4006
     [PHP] $_SERVER3450
     php 에서 세션시간설정1338
     업로드 용량과 관련한 php.ini 파일 설정1291
     mbstring - PHP 확장모듈을 추가하는 방법1335
       [RE] mbstring - PHP 확장모듈을 추가1460
     타도메인간 쿠키 공유하기1711
     home 데이타 백업 스크립트1285
     cron 이용 일정시간마다 php문실행2103
     cron, crontab, PHP 소스 자동실행, 1569
     crontab 에서 php 파일 실행이 가능한지요?1402
     crontab php 스크립트 실행문제입니다.(1) 1286
     2차 도메인과의 세션고유1512
  POST로 값을 넘길때, 만료된 페이지입니다 문제의(홈마스타)3079
     세션(로그인)시간 무한대로 늘리기 초간단 초보용(홈마스타)(2) 1395
     php mysql 세션 관리(홈마스타)2467
     세션을 DB로 관리하기 + 쪽지 확인하기(홈마스타)(1) 1596
     브라우져를 종료해도 세션이 그대로 살아있어요(홈마스타)2453
     PHP에서 세션 사용하기(홈마스타)1381
     [설치/설정] PHP 파일업로드시 일정용량 이상 업(홈마스타)1258
     php.ini 값 설정가능한 범위 알아보기(홈마스타)1521
     PHP 슈퍼전역변수 들의 종류(홈마스타)19374
     쿠키공유를 위한 헤드값(홈마스타)1399
     php.ini 설정하기(홈마스타)1400
     php.ini (V4.2.3) - III(홈마스타)1380
     php.ini (V4.2.3) - II(홈마스타)1424
     환경을 실행중에 임시로 바꾸기(홈마스타)1279
     php.ini (V4.2.3)(홈마스타)1469
     error_reporting(홈마스타)1773
     경과만료 페이지 없애기(홈마스타)1620
≪ [1]  [2]   ≫

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



 
최근 글
[손님]
84
73
229
376
621
374
415
239
358
3807
911
954
1199
974
4266
 
인기 글
[손님]
  [홈마스타] 중보입력 방지 루틴
7016
3364
3706
4145
4076
3117
5315
6242
8287
6524
3766
5570
4047
3984
5648