www.domain.com 
chat.domain.com 
shop.domain.com 
mail.domain.com 등등 
뒷부분은 같고 호스트 부분이 틀릴때 세션을 공유하는 방법입니다. 

일단, 쿠키와 세션에 대한 기본적인 이해부터 하겠습니다. 원리는 간단하니까요.. 

일단, 서버의 도메인이 www.domain.com 이라고 가정을 하겠습니다. 


1. 먼저 쿠키.. 

www.domain.com 에서 쿠키를 발행할수 있는 최대범위는 .domain.com 입니다 
그니까 다음처럼 하면 

setCookie("logid","gagamel", 0, "/", ".domain.com"); 
setCookie("passwd","gozila", 0, "/", ".domain.com"); 

뒤부분이 .domain.com 으로 끌나는 서버(예를들면 shop.domain.com)에서는 www.domain.com 에서 발행한 쿠키를 쓸 수 있게 되죠. 

echo $logid; <-- 요렇게요.... 

하지만 쿠키는 중요정보가 모두 클라이언트쪽으로 보내진다는데서 보안상 무척 좋지 않습니다. 
그래서들 요즘에는 세션를 쓰죠...^^ 


2. 세션이란? 

세션은 쿠키의 단점을 보완하고자 만들어졌습니다. 
위의 예를 들자면 

$logid = "gagamel"; 
$passwd = "gozila"; 
session_register("logid"); 
session_register("passwd"); 

요렇게 쓰겠죠..... 
이렇때 실제로 세션은 어떻게 동작을 하는가.?? 

실제로 위의 logid 갈은 변수들의 값은 서버에 기록이 됩니다. 
보통 설정에 파일로 기록이 되게 되어 있죠. 
위치는?? 
물론 설정에 /tmp 밑에 저장이 되게 되어 있습니다. 
그럼 파일이름은?? 
그건 php 가 그때그때 랜덤하게 유니크한 값을 만들어서 파일이름으로 씁니다.. 
sess_50fffa7e58f63c83ac0473fb928f17ed <-- 머 요딴거 
그리구 나서 이 파일이름을 클라이언트에게 쿠키로서 보내주게 되어있죠.. 


그럼 php 가 아래같은 문장을 만나게 되면 

echo $logid; 

일단 쿠키로 발행한 그 파일이름은 이미 헤더정보로 클라이언트에게서 읽어온 상태입니다. 
그리고 설정에서 정한 위치에 똑같은 파일이름이 있나 확인하구 있으면 거기에 있는 변수값을 읽어오는거죠... 
물론 파일이 없으면 누가 세션스푸핑을 한다거나 세션 만료시간으로 인해 파일이 없어졌다거나 한거겠죠.. 

쉽죠..^^ 세션은 쿠키를 보안한거지 전혀 새로운 개념은 아닙니다... 


3. 자, 그럼 세션공유를 해 봅시다... 

php.ini 에 보면 세션의 기본 설정은 
- session.save_handler      = files   ; 저장방식은 파일로 (db도 가능) 
- session.save_path         = /tmp    ; 위치는 /tmp 
- session.name              = PHPSESSID  ; 쿠키로 발행될 쿠키변수 이름 
- session.cookie_path       = /       ; 쿠키가 유효한 디렉토리 
- session.cookie_domain     =         ; 쿠키가 유효한 도메인인데 기본은 비어있습니다 
- 다른건 생략 

요렇게 되어 있습니다. 그래서 디폴트 상태로 세션을 쓰게 되면 쿠키로 발행된 세션의 파일이름은 현재의 도메인에만 먹게 되어 있죠.. 

여기서 두가지만 바꾸어 주게되면 .domain.com 으로 끝나는 모든 서버에 세션이 먹게 됩니다.. 

session.save_path         = /tmp    ; 
session.cookie_domain     = .domain.com ; 

일단 두번째 처럼 해주면 쿠키로 발행된 PHPSESSID 는 .domain.com 의 모든 서버에서 먹게 됩니다... 

첫번째는 실제 파일이 저장되어 있는 위치라고 말씀드렸죠.. 
만약 같은 서번데 도메인만 틀릴경우에는 변경할 필요없습니다. 
그러나 서버가 틀리다면 문제가 있습니다. 
이렇땐 nfs 등의 디렉토리 공유 방법을 써서 그쪽 디렉토리 이름으로 지정을 해 주셔야 합니다. 
디렉토리 소유권은 nobody 로 해주고 권한은 700 정도로 해주면 됩니다. 
이렇게 하면 세션은 공유가 되죠....^^ 

아님 nfs 등을 쓰기가 꺼림직하면 세션을 아예 db로 저장을 해서 공유하는 방법이 있습니다.. 
이건 세션핸들러 등으로 검색하면 잘 설명되어 있습니다. 그걸 참조하세요. 


여기까지가 제가 함 해봐서 성공한겁니다... 

그럼 좋은 하루 되세요....^____^ 
끝까지 읽어주셔서 감사하구요, 
전. "linux-php 에서 mssql 억세스 완결판...일려나" 를 쓴 바로 그 넘입니다. 






음....
아주 가끔가다 위 글에 대한 질문이 옵니다...
그려서 훨 좋은 db에 세션을 저장하는 방법을 추가로 올립니다....


이전의 방법은 php.ini 를 일일이 수정해 줘야 하기땜에 손이 많이 갑니다


나아진점은
1. 세션값을 디폴트는 /tmp 밑에 저장하는데 이걸 mysql 을 이용합니다...
    이렇게 하면 속도도 빨라지고 혹시 서버가 별개이어도 mysql 만 접근이 가능하면 문제가 되지 않습니다.
2. php.ini 는 전혀 수정하실 필요 없습니다. (소스상에서 설정 다 바꾸어 줍니다)

머 이정도네요....



설명 들어갑니다...

1. 먼저 아래처럼 session.inc 라는 파일이 있습니다..



[session.inc]

<?
/* ------------------------------------------------------------------------
* Create a new database in MySQL called "sessions" like so:
*
* CREATE TABLE sessions (
*      sesskey char(32) not null,
*      expiry int(11) unsigned not null,
*      value text not null,
*      PRIMARY KEY (sesskey)
* );
*/

$SESS_DBH = ""
;
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime"
);

function
sess_open($save_path, $session_name
)
{
    global
$SESS_DBH
;

   
$SESS_DBH = mysql_pconnect("localhost", "heal", "moga33") or die("Can't connect to SQL Server"
);
   
mysql_select_db("heal", $SESS_DBH) or die("Can't connect to SQL Server"
);

    return
true
;
}

function
sess_close
()
{
    return
true
;
}

function
sess_read($key
)
{
    global
$SESS_DBH, $SESS_LIFE
;

   
$qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time
();
   
$qid = mysql_query($qry, $SESS_DBH
);

    if (list(
$value) = mysql_fetch_row($qid
)) {
        return
$value
;
    }

    return
false
;
}

function
sess_write($key, $val
)
{
    global
$SESS_DBH, $SESS_LIFE
;

   
$expiry = time() + $SESS_LIFE
;
   
$value = addslashes($val
);

   
$qry = "INSERT INTO sessions (sesskey,expiry,value) VALUES ('$key', $expiry, '$value')"
;
   
$qid = mysql_query($qry, $SESS_DBH
);

    if (!
$qid
) {
       
$qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time
();
       
$qid = mysql_query($qry, $SESS_DBH
);
    }

    return
$qid
;
}

function
sess_destroy($key
)
{
    global
$SESS_DBH
;

   
$qry = "DELETE FROM sessions WHERE sesskey = '$key'"
;
   
$qid = mysql_query($qry, $SESS_DBH
);

    return
$qid
;
}

function
sess_gc($maxlifetime
)
{
    global
$SESS_DBH
;

   
$qry = "DELETE FROM sessions WHERE expiry < " . time
();
   
$qid = mysql_query($qry, $SESS_DBH
);

    return
mysql_affected_rows($SESS_DBH
);
}

session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc"
);
session_set_cookie_params(0, "/", ".url.com"
);

session_start
();

?>




이 파일이 젤 중요한데요...
요걸 세션을 쓰는곳마다 (그니까 session_start() 가 쓰이는 곳) 마다 첨부시켜주세요....
젤 위부분에 보면 테이블이 있습니다. 이거 mysql 에 만들어 주세요. 세션이 저장될 테이블입니다.
글구 젤 밑에서 두번째 줄에 보면
session_set_cookie_params(0, "/", ".url.com");
이게 있는데여 요걸 그쪽 도메인에 맞게 수정해 주세요...




2. 그리구 테스트 해보는 파일....

[session.php]

<? 

   
include "session.inc"
;

    if (
$mode == 'login'
)
    {

        if ( 
$logid=='toughing' && $passwd=='aaaa'

        {
            echo(
"
                Login OK....<br>
            "
);

           
$_logid = $logid
;
           
$_passwd = $passwd
;
           
session_register("_logid"
);
           
session_register("_passwd"
);

            echo(
"    <meta http-equiv='Refresh' content='1; URL=session1.php'>    "
);
        }
        else
        {
            echo(
"Login Failure....<br>"
);

            echo(
"    <meta http-equiv='Refresh' content='3; URL=$PHP_SELF'>    "
);
        }

        exit;
    }
    else if (
$mode == 'logout'
)
    {
       
session_unregister("_logid"
);
       
session_unregister("_passwd"
);

        echo(
"    <meta http-equiv='Refresh' content='0; URL=$PHP_SELF'>    "
);
    }

   
//sess_gc(1);
   
echo(
"
      <form name='log' action='$PHP_SELF' method='post'>
        <input type=hidden name=mode value=login>
        아이디 <input type=text size=10 name='logid' style='border : 1 solid #666666; font-family : 돋움'><br>
        암호 <input type=password size=10 name='passwd' style='border : 1 solid #666666; font-family : 돋움'><br>
        <input type=submit value='확인'>
      </form>
    "
);

?> 




[session1.php]

<?
   
include "session.inc"
;

    if (
$_logid && $_passwd
)
    {
        echo(
"
            이 페이지는 로그인을 한 사람만 볼 수 있당..<br>
            <a href='test.php'>갈은 도메인</a>
            <a href='http://www.hul.com/test.php?$SID'>다른 도메인</a>
                <form name='log' action='session.php' method='post'>
                    <input type=hidden name=mode value=logout>
                    <input type=submit value='로그아웃'>
                </form>
        "
);
       
$ss = session_get_cookie_params
();
        echo(
"^$ss[lifetime]^$ss[path]^$ss[domain]^"
);
        exit;
    }


    echo(
"아무나 다 보는 페이지..<br>"
);

?>

출처 : Tong - 夢魂™님의 # 기술 자료통

  1. 3 bartender 2008.03.13 06:08

    너는 아주 좋은 보는 위치가 있는다!

  2. naked uncensored celebrities 2008.05.23 04:49

    친구는 위치의 너의 현재 팬이 되었다!

+ Recent posts