사이트 내 전체검색
PHP
[php] 세션
로빈아빠
https://cmd.kr/php/494 URL이 복사되었습니다.

본문

세션

1) Session의 의미와 구현원리
  PHP 3.0 에서는 4.0으로 올라오면서 가장 눈이 띈 변화라면 세션을 사용할수 있다 라는거겠죠..
이제 세션의 의미를 말씀드린다면 어떤 유저가 어떤 특정 사이트를 접속하여 머물러 있는 시간이라고 말할수 있습니다. 좀 더 어렵게 설명을 한다면, 웹서버는 서로 다른 유저들로부터 서버 내에 있는 페이지를 요청이 들어올 경우에 각 유저들의 컴퓨터에 유일무이한 식별키를 쿠키의 형태로 발급하여 해당 유저가 사용자의정보 즉, 사용자의 로그인이나 기타 입력된 정보를 서버 내에 저장하여 유저가 다시접속하였을때 유저에게 발급한 식별키를 이용하여 서버쪽에 저장해놓은 정보(세션값)를 가져옴으로써 유저를 구별하는 원리로 구현된다고 볼수 있습니다.
다음은 세션과 쿠키의 차이점에 대해서 말씀드리겠습니다.
쿠키가 모든 유저나 회원들의 정보를 사용자의 시스템에 저장하는 반면에 세션은 유저의 데이터를 서버쪽에 저장하여 유저의 시스템에는 서버에 저장되어 있는 해당 사용자의 데이터를 찾아서 가져올 수 있는 식별키만를 저장하기 때문에 유저의 신상정보나 귀중한 정보가 밖으로 빠져나가는것을 막을수 있어 보안측면에서 좀더 안전하다고 할수 있는 있습니다. 
 
2) Session 다루기
① 세션 저장방법
우선 PHP에서 세션 데이타를 서버 상에 저장하는 방법에 대해서 설명을하면
첫번째, 사용자의 데이터를 환경설정 파일(PHP.ini)에서 지정한 디렉토리에 파일로저장하는 방식으로 가장기본적인 방법이라고 할수 있습니다. 자 예를 들어 유저의 시스템에 저장한 식별키가 "0cd9cdv1vdf4fd4"이라면 서버 내 지정한 디렉토리에는 "sess_0cd9cdv1vdf4fd4"라는 이름을 갖는 파일로 생성하게 됩니다.
그러므로 식별키가 "0cd9cdv1vdf4fd4"인 유저가 사이트에 접속했을때 서버에서는 이 식별키에 해당하는 파일을 열어 해당사용자의 정보를 가져오게 되는 방법입니다.

두번째, 서버의 파일이 아닌 서버의 메모리에 저장하는 방식으로 파일로 저장하는 방법보다,높은 성능을 기대할수 있습니다. 특징으로 접속한 유저의 시스템에 식별키를 발급할 때 32개의 문자열로 이루어진 세션 아이디를 생성한다는 점입니다. 이 값은 유저의 시스템에 저장되며 유저가 서버에 접속했을 때 브라우저를 통해 서버에 자동 전송되므로 서버쪽에서 웹사이트에 접속해 있는 유저를 서로 구별할 수 있는 근거가 되겠죠..

세번째, 사용자가 직접 세션을 다루는 방식을 정의하는 방법으로 보통 이 방법을 이용하여 세션 데이터를 파일이나 메모리,혹은 데이타베이스에 저장하여 관리하는 방법입니다. 세번째 방식의 특징은 이렇게 생성한 세션 아이디값은 보통 쿠키 방식을 통해 사용자의 시스템에 저장한다는 점입니다. 그러나 만약에 유저의 브라우저가 쿠키를 허용하지 않도록 설정되어 있다면, 이방식은 아무런 의미가 없겠죠!따라서 이때에는 쿠키가 아닌 다른 방식으로 웹서버에 사용자의 식별키를 전달 할 수 있는 방법을 사용해야 하며 이럴 경우 보통은 웹페이지 요청시에 세션 아이디값을 get이나 post방식을 통해 함께 전달해주는 방식을 사용합니다.


② 세션 생성,등록,삭제및 종료하기
세션을 시작하는 방법은 간단하다..
<? 
session_start()
?>


이렇게 세션함수를 호출하면 유저의 시스템에 이전에 발급된 유효 세션이 있는지 확인하게 되고, 검사결과 이전값이 없다면, 새로 세션아이디를 생성하고 이전에 발급한 아이디가 있고, 유효하다면, 서버에 저장한 데이터를 그대로 사용하게 되는것입니다.
이때 세션아이디는 기본적으로 PHPSESSID라는 이름을 갖는 변수에 저장됩니다.
예를 들어 세션 아이디 값이 "3dff4fdg4h43"이라면 쿠키 변수 $HTTP_COOKIE_VARS["PHPSESSID"]에 이 세션 아이디값이 저장되는 것입니다.

자 이제 값을 등록시켜봅시다.
<? 
session_start()
session_register("name");
$name="선즈";
?>


세션등록은 session_register라는 함수를 사용합니다.
이렇게 등록된 세션 파일 안에는 name|s:4:"선즈"; 이라는 내용이 들어가게 됩니다.
세션 변수 삭제방법또한 간단하죠..
위에 보시면 name이라는 변수로 세션을 등록하였습니다.
반대로 삭제하시려면, session_unregister("name");이라고 쓰면 되겠죠..
마지막으로 세션를 종료하려면 session_destory();라는 함수를 쓰면됩니다.
세션을 종료한다는 의미는 현재의 세션과 관련된 모든 데이터를 삭제한다는 의미입니다. 즉 이 함수를 호출한 사용자의 세션에 등록되어 있는 모든 데이터를 완전히 삭제한다는 뜻입니다.

사실 웹서버 측에서 본다면 유저가 언제 웹사이트를 떠났는지 즉 사용자의 세션이 언제 끝났는지 만약 회원일때 로그아웃을 하지 않고 브라우저를 닫았을때 와 같이 그 시점을 알수가 없습니다. 그래서 웹서버가 사용자의 세션을 무효화시킬지를 결정하는 방법을 알려드리겠습니다. php의 세션 설정 항목중에 session.gc_maxlifetime 항목의 값을 수정해주는방법입니다. 보통은 1440초 즉 24분으로 되어있는데 이걸줄여주는방법이 있고,session.gc_probiblty란 항목 이것은 이렇게 더 이상 의미없는 세션데이터를 삭제하는 실행주기를 설정하는 항목으로 기본값은 1로 되어있지만, 1이라함은 1%를 의미합니다. 이값을 늘려주시면 됩니다.~
 
3) Session 처리 함수 소개
  함수 기능
session_start 세션을 생성하는 함수
이때 반드시 알아야 할점은 사용하고자하는 스크립트 최상단에 호출해주어야 합니다.이 함수를 호출하기 전에는 어떤한 함수의 실행결과나 html코드도 먼저 브라우저에 전송되어서는 안된다는얘기죠.. 왜냐면 이 함수는 사용자의 시스템에 세션 아이디를 쿠키의 형태로 발급하기 때문입니다.
만약 이함수를 호출전에 다른 태그를 사용할경우 아래 그림과 같은 메세지가 나올것입니다.
 
session_register 현재 연결된 세션에 데이터를 저장할 변수를 등록한다
세션을 등록할때는 보통 변수를 사용하여 등록을 하게 되는데 대략 방법은 다음과 같다.
session_start()
session_register("name");
session_register("id"); $name="sunz";$id="sunz";


이때 session_register("name","id"); 이런식으로되 구문을 줄일수 있습니다. 
 
session_unregister 현재 연결된 세션에서 특정변수를 삭제시키는 함수
예시) session_unregister("변수"); 
 
session_unset 현재 연결된 세션에 등록되어 있는 모든 변수의 값을 삭제하는 함수
session_unregister랑 다른점은 변수는 그대로 두고 변수값만 지운다는것입니다.
 
session_destroy 현재의 세션을 종료시키는 함수
 
session_is_registered 세션 변수가 현재의 세션에 등록되어 있는지를 조사하는 함수
session_is_registered("string name")
 
session_save_path 세션 데이터 파일 저장되어 있는 경로를 반환하거나 지정한 디렉토리로 변경하는 함수
보통기본값은 /tmp 디렉토리로 설정되어있습니다.
여기서 유의해야할사항 몇가지!
php.ini파일에 보시면 session.save_path = /tmp 이라는 옵션이 있는데 이것은 리눅스나 유닉스에 해당하는 디렉토리므로, 윈도우라면 D:/tmp 이런식으로 수정해야 합니다.
또한 변경하고 하는 디렉토리가 실제 존재해야 하며 디렉토리 권한 은 반드시 777로 해주셔야 합니다.
이런식으로 디렉토리를 변경할경우에는 해당 세션과 관련된 데이터를 참조하는 모든 스크립트에 session_save_path()함수를 호출해주셔야 합니다.
마지막으로 세션을 시작하는 session_start()함수 전에 이값을 호출해주셔야 합니다.
 
session_name 현재의 세션 이름를 반환하거나 지정한 이름으로 변경하는 함수
이 함수는 인자 없이 호출하였을 경우 현재 세션의 이름을 반환하는 함수입니다. 그러나 인자를 지정하여 호출할 경우에는 지정한 값으로 현재 세션의 이름을 변경합니다. 기본값은 PHPSESSID라는 이름을 가지며 이 값 또한 php.ini에서 수정할수 있습니다.

session.name=PHPSESSID<--수정해주면 번거러움을 덜수있겠죠!

위의 session_save_path함수처럼 이 함수를 통해 변경한 세션이름은 함수를 호출한 스크립트내에서만 유효하므로 변경된 함수를 사용하실 곳에서는 항상 session_start()함수보다 먼저 호출해주셔야 합니다.
 
session_id 현재의 세션 아이디를 반환하거나 지정한 값으로 변경하는 함수, 현재사용하는 세션 아이디를 구할때나 사용하죠..
 
session_module_name 세션 데이터 다루는 저장 방식에 관한 정보를 반환시키는 함수
첨에 세션의 저장방식에 대해서 설명드릴때 3가지 방법이 있다고했죠,파일저장방법, 메모리저장바업,사용자가 세션을 다루는 방법을 직접정의하는방법이 세가지 방법을 값으로 변환해주는 함수입니다. 이 함수도 PHP환경설정 파일(php.ini)내에서 수정이 가능합니다.

session.save_handler = files; <---기본값이죠
 
session_get_cookie_params 세션 쿠키와 관련된 정보를 배열의 형태로 반환시키는 함수
이 함수는 세션 쿠키의 유효 기간과 이 쿠키값을 참조할 수 있는 디렉토리나 도메인 범위 등을 연관 배열의 형태로 반환합니다. 키값은 유효기간을 표시하는 lifetime과 쿠키값을 참조할수 있는 디렉토리값 path 와, 도메인 domain 키값이 있습니다. 기본적으로 lifetime은 0, path는 /, 도메인은 ''빈값으로 되어있습니다.
 
session_set_cookie_params 세션쿠키를 발급할 때 필요한 인자를 설정하는 함수
위의 get_cookie_paranms가 정보값을 배열로 반환한다면 이것을 그값들을 설정하는 함수입니다.
 
session_encode 현재의 세션에 저장되어 있는 데이터를 인코딩하여 인코딩된 문자열를 반환하는 함수입니다.
쉽게 말해서 세션을 등록시에 생기는 데이터들, 보통은 파일로저장되는 세션정보를 문자로 변환해준다는 뜻입니다. 
 
session_decode 함수의 인자로 전달한 세션 데이터를 디코딩해주는 함수
 
 
session_cache_limiter 현재 cache limiter 항목의 값으로 설정되어 있는 이름을 반환하거나 이 이름을 지정한 이름으로 변경한다.
유저의 브라우저에 전송되는 HTTP헤더를 이요하여 사용자가 요청한 웹페이지의 내용을 사용자의 시스템에 캐시로 남길 수 있도록 허용할것인지 그 허용수준을 어느정도로 할것인지를 조절하는 항목으로 PHP의 환경설정 파일(php.ini)에서도 이 cache limiter의 단계를 3단계로 구분되도록 되어있습니다. 첫째 nocache는 유저의 시스템에 cache를 보관하지 않으며, 두번째 public은 유저의 시스템에 저장하며, 셋째 private도 마찬가지로 유저가 요청한 페이지를 시스템에 cache로 남지기만 public보다는 좀 엄격합니다.
 
session_set_save_handler 세션을 다룰 수 있는 사용자 정의 함수를 구현한다.

 

간단한 세션 열고 닫기 예제..
<? 
session_start();
@error_reporting(E_ALL ^ E_NOTICE);
@extract($HTTP_GET_VARS);
@extract($HTTP_POST_VARS); 
@extract($HTTP_SERVER_VARS); 
@extract($HTTP_ENV_VARS);

//처음 페이지가 로딩될 때는 $mode에 값이 없으므로 switch문은 그냥 통과된다. 
echo " >>", $mode, "<< ";
switch ($mode) 
{ 
case 'register': 
// 세션_시작 
// $count란 세션변수를 등록한다. 
if(!session_register("count")) 
 echo "세션등록에 실패하였습니다.<br>"; 
$HTTP_SESSION_VARS['count'] = 0;
break; 

case 'count': 
// 세션등록된 $count 증가 
$HTTP_SESSION_VARS['count'] = $HTTP_SESSION_VARS['count'] + 1;
break;

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

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

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

<a href="session.php?mode=register">세션변수 등록</A> | 
<a href="session.php?mode=count">세션변수 증가</A> | 
<a href="session.php?mode=unregister">등록된 세션변수 제거</A> | 
<a href="session.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>

댓글목록

등록된 댓글이 없습니다.

PHP
871 (10/18P)

Search

Copyright © Cmd 명령어 18.188.59.124