Skip to content

PHP 학습 [php]쿠키값 적용 활용팀

2009.03.25 17:33

디케 조회 수:39598




[php]쿠키값 적용 활용팀


블로그 등 서비스를 제공하는 www.aaa.com 에 로긴 한 후 내 블로그 바로가기 링크 등으로 새창으로 blog.aaa.com 으로 넘어가는 경우 www.aaa.com 에서 생성한 세션은 적용되지 않습니다. 이는 가상호스트 별로 세션이 공유되지 않기 때문이죠.. 


웹서버내의 호스트가 www.aaa.com 과 blog.aaa.com 및 cafe.aaa.com 등 .aaa.com 호스트들만 있다면 php.ini 의 설정 에 session.cookie_domain = .aaa.com 값을 줌으로써 간단하게 해결되지만 .bbb.com 등 다른 호스트들도 있다면 .bbb.com 호스트들은 세션이 먹통이 되어버리기 때문에 이 값을 사용할 수가 없습니다. 


페이지 스크립트에 
ini_set("session.cookie_domain", ".aaa.com"); 
session_set_cookie_params(3600, "/", ".aaa.com"); 
을 달아주어도 php버젼 문제인지 적용이 되질 않더군요; (4.3.10 입니다.) 



제가 사용하는 방법은.. 

일단 blog.aaa.com 등 서브도메인 호스트의 로그인 처리, 로그아웃 처리를 www.aaa.com 호스트의 로그인, 로그아웃 파일로 처리합니다. 

우선 www.aaa.com 에서의 로긴처리페이지에서 쿠키를 2개 굽습니다. 


<? // www.aaa.com/loginOK.php 
setcookie("Member_ID", $member_id, 0 , "/", ".aaa.com"); 
$Session_Key = crypt($member_id, "keyName"); 
setcookie("Session_Key", $Session_Key, 0, "/", ".aaa.com"); 
?> 


위의 두 쿠키는 현재 창이 닫힐 때까지 존재하고 현재 창에서 새창으로 열리는 .aaa.com 호스트에서 이를 사용할 수 있습니다. 

현재 창에서 블로그 바로가기 등 새창으로 blog.aaa.com 이 열린다고 가정하구요. blog.aaa.com/index.html 등의 인덱스 페이지를 프레임 셋 합니다. 


<!-- blog.aaa.com/index.html --> 
<frameset rows="0,*" frameborder="no" border="0"> 
  <frame src="./hidden.php" name="hidden" scrolling="no" noresize> 
  <frame src="./index_main.php?<?=$HTTP_SERVER_VARS["QUERY_STRING"]?>" name="main" scrolling="auto" noresize> 
</frameset> 


index.html 에 get 값으로 넘어가는 변수들은 $HTTP_SERVER_VARS["QUERY_STRING"] 로 index_main.php 에 고스란히 넘길 수 있겠죠. 

히든 페이지인 hidden.php 를 다음과 같이 만들었습니다. 


<? // blog.aaa.com/hidden.php 
include "../include/DBClass.php"; 

if ($_COOKIE["Member_ID"] && !$_SESSION["_Member_No_"]) { 
   $Session_Key_Tmp = crypt($_COOKIE["Member_ID"], "keyName"); 
   if ($Session_Key_Tmp==$_COOKIE["Session_Key"]) { 

     $info = $db->resultArray("Select Member_No From member Where Member_ID='".$_COOKIE["Member_ID"]."'"); 
     
     if ($info["Member_No"]) { 
       session_register("_Member_No_"); 
       session_register("_Login_Ip_"); 

       $_Member_No_ = $info["Member_No"]; 
       $_Login_Ip_ = $REMOTE_ADDR; 
     } 
   } 

?> 


blog.aaa.com/index.html 가 열릴 때 hidden.php 가 먼저 엑세스 되면서 아이디쿠키가 있다면 이를 키값쿠키와 비교하여 세션을 생성시킵니다. www.aaa.com 과 세션을 공유하는 것은 아니고 blog.aaa.com 호스트에 대한 세션이 별도로 생성되는 것이죠;; 


www.aaa.com 에 있는 로그아웃 처리파일에 다음을 추가합니다. 
(.aaa.com 의 호스트들은 로그인, 로그아웃 처리파일을 공유합니다.) 


<? // www.aaa.com/logout.php 
setcookie("Member_ID", '', 0, "/", ".aaa.com"); 
setcookie("Session_Key", '', 0, "/", ".aaa.com"); 

//블로그 세션 삭제 
echo "<iframe src='http://blog.aaa.com/logout.php' width=0 height=0 frameborder=0></iframe>"; 
?> 


위의 blog.aaa.com/logout.php 에는 다음과 같이 하면 되겠죠.. 


<? // blog.aaa.com/logout.php 
session_start(); 

if ($_SESSION["_Member_No_"]) { 
   $_Member_No_ = ""; 
   $_Login_Ip_ = ""; 

   session_unregister("_Member_No_"); 
   session_unregister("_Login_Ip_"); 

   session_unset(); 
   session_destroy(); 

?> 


그런데 여기까지 하면 문제가 발생합니다; 

blog.aaa.com/index.html 등의 인덱스 페이지가 처음 열릴때에 쿠키를 체크하여 세션을 생성하는 것이기 때문에, 이미 blog.aaa.com/index.html 페이지에 들어와 있는 상태에서 로그인하여 돌아온다면 컨텐츠 프레임만 리플레쉬 되는 것이므로 www.aaa.com 에만 세션이 생성되죠. 


그래서 로그인 처리파일에 리턴 URL 값을 체크하여 처리하는 부분을 넣어주었습니다. 


다른 서브도메인에서도 다시 돌아오기 위해 로긴 폼에서 다음의 리턴 URL 값을 넘기는데 

<input type="hidden" name="ReturnUrl" value="http://<?=$HTTP_HOST.$PHP_SELF?>?<?=$HTTP_SERVER_VARS["QUERY_STRING"]?>"> 

이 값을 체크하여 $HTTP_HOST 가 blog.aaa.com 이면 세션을 생성합니다. 


<? // www.aaa.com/loginOK.php 
if (eregi("blog.aaa.com",$ReturnUrl)) { 
   //블로그 세션 생성 
   echo "<iframe src='http://blog.allthing.co.kr/hidden.php' width=0 height=0 frameborder=0></iframe>"; 

?> 


blog.aaa.com 에 히든프레임을 쓰지 않고 www.aaa.com/loginOK.php 에서 처리시 무조건 www.aaa.com 및 blog.aaa.com 세션을 생성시켜도 되지만 www.aaa.com 가 주로 상주하는 호스트이기에 blog.aaa.com 의 세션은 blog.aaa.com 에 상주하고 있을 때만 생성되면 되기에 위와 같이 하였습니다. 


그리고 blog.aaa.com 의 index.html 등의 인덱스 프레임 셋의 메인 컨텐츠 페이지인 index_main.php 을 직접 브라우저 URL 에 입력하여 들어올 수도 있으므로 index_main.php 에서 프레임을 체크할 수도 있겠죠. 


<!-- blog.aaa.com/index_main.php --> 
<script language="javascript"> 
function frameCheck() { 
   if (this==top) document.location.replace("./<?=$HTTP_SERVER_VARS["QUERY_STRING"]?>"); 

</script> 

<body onload="frameCheck()"> 


히스토리에서 지우기 위해 href 대신 replace 를 쓰면 될 듯.. 


이상 제가 주도메인과 서브도메인 같이 세션 적용하는 방법이었습니다. -_- 

태클 및 조언 환영합니다 ~.~ 
  
  
  

  
   3년차 초보   06-03-10 10:48   
도메인별로 쿠키를 만들고, 접속 시에 디비 커넥션 부분에서 쿠키 체크 후, 세션 생성을 했었는데.. 
단지 문제가 창 닫았을 경우 다시 열면 로그인이 되어 있는 문제가..  
  
도메인별로 쿠키를 만들고, 접속 시에 디비 커넥션 부분에서 쿠키 체크 후, 세션 생성을 했었는데.. 
단지 문제가 창 닫았을 경우 다시 열면 로그인이 되어 있는 문제가.. 
  
   sjsjin   06-03-10 14:51   
// 내용중에 틀린게.. 
ini_set("session.cookie_domain", ".aaa.com"); 
session_set_cookie_params(3600, "/", ".aaa.com"); 
을 달아주어도 php버젼 문제인지 적용이 되질 않더군요; (4.3.10 입니다.) 
--> 를 
session_set_cookie_params(0, "/"); 
ini_set("session.cookie_domain", ".aaa.com"); 

* 위처럼 해서 써보십시오. 
ini_set 에서 쿠키도메인을 설정했으므로 밑에서는 따로 설정할 필요가 없습니다. 
그냥 루트인 / 만 입력하면 됩니다. 
세션공유는 지금까지 위 처럼 작업했습니다만, 안되는곳은 보지 못했습니다.  
  
// 내용중에 틀린게.. 
ini_set("session.cookie_domain", ".aaa.com"); 
session_set_cookie_params(3600, "/", ".aaa.com"); 
을 달아주어도 php버젼 문제인지 적용이 되질 않더군요; (4.3.10 입니다.) 
--> 를 
session_set_cookie_params(0, "/"); 
ini_set("session.cookie_domain", ".aaa.com"); 

* 위처럼 해서 써보십시오. 
ini_set 에서 쿠키도메인을 설정했으므로 밑에서는 따로 설정할 필요가 없습니다. 
그냥 루트인 / 만 입력하면 됩니다. 
세션공유는 지금까지 위 처럼 작업했습니다만, 안되는곳은 보지 못했습니다. 
  
   TarauS   06-03-13 19:13   
예전에 제가 비슷한 문제로 고민했었던 적이 있습니다. 
그에 관련된 글의 주소를 남겨드립니다. 
http://www.phpschool.com/gnuboard4/bbs/tb.php/tipntech/19298