Skip to content

2009.05.13 13:51

세션관련 설명입니다

조회 수 7623 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
세션이란 무엇일까? 서버와 클라이언트가 웹에서는 계속적으로 연결되어 있는 것이 아니고 페이지에 대한 요청과 전송이라는 하나의 사이클을 단위로 연결이 끊어진다고 하였다. 세션이란 이러한 상황을 해결하기 위해 쿠키를 확장하여 개발한 웹에서의 연결관리 기능이다. 인터넷에서 암호화되지 않은 데이터의 송수신에선 그 중간에서 데이터를 가로채어 해석할 수 있다. 그러므로 중요한 아이디나 패스워드를 클라이언트에 저장하고 페이지를 이동할 때마다 서버와 주고받는다면 중간에서 정보를 가로챌 확률은 증가한다. 그러므로 쿠키는 그리 중요하지 않은 정보에 사용하는 것이 좋다. 
PHP4에서 세션사용하기 
세션(Session) 

세션이란 무엇일까? 서버와 클라이언트가 웹에서는 계속적으로 연결되어 있는 것이 아니고 페이지에 대한 요청과 전송이라는 하나의 사이클을 단위로 연결이 끊어진다고 하였다. 세션이란 이러한 상황을 해결하기 위해 쿠키를 확장하여 개발한 웹에서의 연결관리 기능이다. 인터넷에서 암호화되지 않은 데이터의 송수신에선 그 중간에서 데이터를 가로채어 해석할 수 있다. 그러므로 중요한 아이디나 패스워드를 클라이언트에 저장하고 페이지를 이동할 때마다 서버와 주고받는다면 중간에서 정보를 가로챌 확률은 증가한다. 그러므로 쿠키는 그리 중요하지 않은 정보에 사용하는 것이 좋다. 


세션은 그에 비에 조금 발전된 형태다. 클라이언트와 서버가 통신할 때 서버에서 세션을 생성하면 클라이언트에선 이 세션의 ID만을 쿠키 등으로 저장한다. 이 세션 ID는 서버에서 접속한 각 클라이언트마다 유일하게 생성하여 중복되는 일이 없다. 이렇게 세션을 생성한 후 정보를 기록할 때는 클라이언트에서 서버로 한번만 전송되고 서버에 저장된다. 그러므로 세션을 종료하기 전까지는 더 이상 서버로 아이디나 패스워드를 전송할 필요가 없다. 단지 세션 ID만 전송하면 되고, 서버에선 세션 ID에 해당되는 세션정보를 가져오면 된다. 


그러므로 쿠키보다 조금 더 안전하다. 참고로 세션 기능은 PHP4에서 추가된 기능이다. 그러므로 PHP3를 사용하는 독자라면 이 기능을 사용할 수 없다. 

1. 세션을 기초 

세션에 대한 설정도 php.ini파일에 기록되어 있다. PHP4를 인스톨하면 기본적으로 다음과 같이 세션에 관련된 설정이 되어 있다. (php.ini의 375번째줄부터 ...) 


------------------------------------------------------------------------------------- 
[Session] 
session.save_handler = files ; 데이터를 저장하고 보여줄 핸들러 
session.save_path = /tmp ; 세션 파일을 저장할 경로 
session.use_cookies = 1 ; 쿠키를 이용한 세션 On 
session.name = PHPSESSID ; 세션이름 (쿠키이름) 
session.auto_start = 0 ; 세션자동시작 Off, 요청해야만 시작. 
session.cookie_lifetime = 0 ; 쿠키의 저장시간 
session.cookie_path = / ; 쿠키 유효 경로 
session.gc_maxlifetime = 1440 ; 1440초 후에 사용되지 않는 것으로 보이는 세션데이터 삭제. 
session.cache_expire = 180 ; 180분 후에 세션을 삭제한다. 
------------------------------------------------------------------------------------- 

더 있지만 중요한 부분만 발췌하였다. 쿠키에 관한 사항은 쿠키를 작성하는 방법을 배울 때 언급했던 것과 같은 것이다. 특히 쿠키의 유효경로가 '/'이어야 하는 이유는 중요하다. 그렇지 않으면 세션을 생성한 디렉토리 및 그 하위디렉토리가 아닌 곳에선 기존의 세션정보를 사용할 수 없기 때문이다. 특별히 옵션에서 손댈 것은 없다. 단지 세션의 지속시간을 길게 하고을 싶다면 "session.gc_maxlifetime"을 길게 잡아주면 된다. 세션의 설정을 확인했으니 이번엔 세션을 만드는 법을 알아보기로 하겠다. PHP의 옵션설정에서 "session.auto_start"가 Off(0)되어있기 때문에 세션을 사용하려면 먼저 세션을 시작하여야 한다. 세션의 시작은 다음의 함수를 이용한다. bool session_start(void); 
실행 후에 반환하는 데이터가 bool(참/거짓)타입인데 언제나 true만을 반환하므로 신경쓸 필요없다. 단지 "session_start();"함으로 세션은 시작된다. 세션이 시작되었으면 세션에 데이터를 저장하거나 불러올 수 있다. 세션에 데이터를 입력하려면 먼저 세션변수를 등록하여 한다. bool session_register(mixed name, mixed [...]); 
세션 변수가 정상적으로 생성되면 참을, 그렇지 못하면 거짓을 반환하며, 변수명인 name에는 여러 가지 타입을 사용할 수 있다. 그리고 쉼표(,)로 구분하여 여러 세션변수를 한번에 등록할 수 있다. 이렇게 등록을 하면 이때부터 세션변수를 사용할 수 있다. 세션 변수의 사용은 일반 변수와 같이 "$세션변수명"의 형태로 사용한다. PHP4는 기본적으로 "EGPCS"의 차례로 변수들을 해석하므로 이를 수정하지 않았다면 S인 세션변수가 언제나 제일 뒤에 해석된다. 그러므로 세션변수와 다른 변수들(POST, GET, COOKIE)과는 중복을 고려하지 않아도 될 것이다. 이렇게 세션변수를 등록했는데 변수를 제거하고 싶을 때가 있을 것이다. bool session_unregister(string name); 
bool session_destroy(void); 
session_unregister()함수는 등록된 세션변수를 제거할 때 사용하며, session_destory()함수는 현재의 세션을 더 이상 사용하지 않으려 할 때 사용한다. 위 두 함수는 세션이 이미 시작되어 있는 상태에서 실행하여야 한다. 


2. 세션을 사용하기 

한명의 접속자가 특정 페이지를 방문하는 카운터를 세션을 이용하여 작성하여 보자. 아래 부분은 세션처리에서 핵심적인 부분이다. 세션을 생성하고, 변수를 등록하고, 변경하고, 삭제하고, 세션전체를 폐기하는 총 4가지 case로 이루어져 있다. 실제 소스에선 mode란 이름의 파라미터를 전송하여 각 경우를 테스해 볼 것이다. 
------------------------------------------------------------------------------------- 
/* 세션 처리의 핵심적인 부분이다. 
$mode의 데이터에 따라 각각 다른 처리를 한다. */ 
switch ($mode) 

case "register": 

// 세션을 시작한다. 
session_start(); 
// $count란 세션변수를 등록한다. 
if(!session_register("count")) 
echo "세션등록에 실패하였습니다.<br>"; 
// 세션 변수 $count에 0을 대입한다. 
$count = 0; 
break; 

case "count": 

// 세션을 시작한다. 
session_start(); 
// 세션등록된 $count 증가 
$count++; 
break; 

case "unregister": 

// 세션을 시작한다. 
session_start(); 
// 등록된 세션변수 $count를 제거한다. 
session_unregister("count"); 
break; 

case "destroy": 

// 세션을 시작한다. 
session_start(); 
// 세션을 폐기한다. 
session_destroy(); 
break; 

------------------------------------------------------------------------------------- 

현재 세션의 상태를 알아보는데 사용되는 함수 및 변수들의 목록이다. 
변수명 또는 함수명 
기능 

session_module_name() 세션 모듈의 이름(저장방식)을 반환한다. 
session_save_path() 세션 파일이 저장되는 경로를 반환한다. 
session_id() 현재 세션의 ID를 반환한다.(서버에 존재하는) 
$PHPSESSID 현재 세션의 ID를 클라이언트에 쿠키로 저장한 변수 
session_is_registered() 세션변수가 등록되었는지 체크 

아래 소스는 위에서 언급한 함수들을 가지고 각 정보를 테이블로 보여주는 것이다. 
------------------------------------------------------------------------------------- 

<table border=1> 
<tr> 
<td>세션 모듈 이름</td> 
<td><? echo session_module_name() ?></td> 
</tr> 
<tr> 
<td>세션 파일이 저장된 경로</td> 
<td><? echo session_save_path() ?></td> 
</tr> 
<tr> 
<td>현재 세션의 아이디</td> 
<td><? echo session_id() ?></td> 
</tr> 
<tr> 
<td>쿠키로 저장된 세션ID</td> 
<td><? echo $PHPSESSID ?></td> 
</tr> 
<tr> 
<td>count세션변수의 등록여부</td> 
<td> 
<? 
if(session_is_registered("count")) 
echo "등록되어있습니다."; 
else 
echo "등록되어 있지 않습니다.<br>"; 
?> 
</td> 
</tr> 
</table> 
------------------------------------------------------------------------------------- 

아래의 $count는 count란 이름의 변수다. 이것은 누구나 다 알고 있을 것이다. 이미 언급했듯이 변수의 해석은 PHP설정파일에서 순서를 정하여 둔다. 초기설정을 변경하지 않았다면 세션변수가 제일 뒤에 해석되므로 count란 세션변수가 등록되어 있고, 세션이 시작된 상태라면 $count는 세션변수 count의 값이 들어있게 된다. 만약 세션이 시작되지 않았거나 세션이 시작되었어도 등록된 변수가 아니라면 $count엔 아무 값도 없을 것이다. 그리고 밑의 4가지 링크는 모두 ex21.php를 가르키지만 GET방식으로 mode란 환경변수에 전송하는 값이 다르다. 이 네가지 값에 따라 제일 처음 언급했던 switch()문에 따라 페이지가 작동하게 될 것이다. 
------------------------------------------------------------------------------------- 


당신은 이 페이지를 <? echo $count; ?>번째 방문하고 계십니다.<p> 

<a href="ex21.php?mode=register">세션변수 등록</A> | 
<a href="ex21.php?mode=count">세션변수 증가</A> | 
<a href="ex21.php?mode=unregister">등록된 세션변수 제거</A> | 
<a href="ex21.php?mode=destroy">세션 제거</A><p> 
------------------------------------------------------------------------------------- 

세부분으로 소스를 나누어 분석해 보았다. 이 소스를 전부 합하면 아래와 같이 완성된 소스가 된다. 이 문서를 서버에 저장하고 웹브라우저로 불러와 보자. [예제 21] ex21.php 
------------------------------------------------------------------------------------- 
<? 
//처음 페이지가 로딩될 때는 $mode에 값이 없으므로 switch문은 그냥 통과된다. 
switch ($mode) 

case "register": 
// 세션_시작 
session_start(); 
// $count란 세션변수를 등록한다. 
if(!session_register("count")) 
echo "세션등록에 실패하였습니다.<br>"; 
$count = 0; 
break; 

case "count": 
// 세션등록된 $count 증가 
session_start(); 
$count++; 
break; 

case "unregister": 
// 등록된 세션변수 $count를 제거한다. 
session_start(); 
session_unregister("count"); 
break; 

case "destroy": 
// 세션관계없이 페이지만 다시 불러온다. 
session_start(); 
session_destroy(); 
break; 

?> 

당신은 이 페이지를 <? echo $count; ?>번째 방문하고 계십니다.<p> 

<a href="ex21.php?mode=register">세션변수 등록</A> | 
<a href="ex21.php?mode=count">세션변수 증가</A> | 
<a href="ex21.php?mode=unregister">등록된 세션변수 제거</A> | 
<a href="ex21.php?mode=destroy">세션 제거</A><p> 

<table border=1> 
<tr> 
<td>세션 모듈 이름</td> 
<td><? echo session_module_name() ?></td> 
</tr> 
<tr> 
<td>세션 파일이 저장된 경로</td> 
<td><? echo session_save_path() ?></td> 
</tr> 
<tr> 
<td>현재 세션의 아이디</td> 
<td><? echo session_id() ?></td> 
</tr> 
<tr> 
<td>쿠키로 저장된 세션ID</td> 
<td><? echo $PHPSESSID ?></td> 
</tr> 
<tr> 
<td>count세션변수의 등록여부</td> 
<td> 
<? 
if(session_is_registered("count")) 
echo "등록되어있습니다."; 
else 
echo "등록되어 있지 않습니다.<br>"; 
?> 
</td> 
</tr> 
</table> 
------------------------------------------------------------------------------------- 

처음에는 $mode에 아무런 값이 없으므로 switch문에선 실행되는 것이 없으며 $count에도 아무런 값이 없다. 그러므로 아래와 같은 결과를 얻게 될 것이다. 

Copyright ADMINPLAY corp. All rights reserved.

abcXYZ, 세종대왕,1234

abcXYZ, 세종대왕,1234