Skip to content

2009.09.19 16:08

php세션정리

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

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
출처 : phpschool

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 세션을 다룰 수 있는 사용자 정의 함수를 구현한다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
48 php mysql에 insert시 싱글쿼츠(홑따옴표) 입력 처리 (mag... ADMINPLAY 2013.09.07 8972
47 Ubuntu 에서 PHP Screw 컴파일시 에러날 때 ADMINPLAY 2013.09.07 7030
46 [php모듈] php 소스 암호화 하기 - php_screw-1.5 file ADMINPLAY 2013.03.26 9617
45 configure: error: utf8_mime2text() has new signature, ... ADMINPLAY 2010.05.18 21989
44 oracle10g + php5.2.11 error [OCIEnvNlsCreate() failed] ADMINPLAY 2010.02.24 71308
43 Warning: Unknown: open(, O_RDWR) failed: No such file ... ADMINPLAY 2010.01.29 19807
42 register_globals 에 따른 서버 변수형 변환 ADMINPLAY 2010.01.09 17905
41 register_globals = off 란? ADMINPLAY 2010.01.09 15583
40 4.1.0이상 php 버전에서 register_globals = Off 일때 기... ADMINPLAY 2010.01.09 15485
39 PHP FreeTDS 사용 (MS-SQL) file ADMINPLAY 2010.01.05 16983
38 Fatal error: Call to undefined function domxml_open_mem() ADMINPLAY 2009.12.31 17399
37 pear 1.9 업그레이드 및 패치설치 ADMINPLAY 2009.12.31 17366
36 PEC HTTP Setup ADMINPLAY 2009.12.31 15979
35 PHP.INI에서의 세션 관련설명 ADMINPLAY 2009.10.19 17546
34 Maximum execution time of 30 seconds exceeded ADMINPLAY 2009.09.28 17436
» php세션정리 ADMINPLAY 2009.09.19 17241
32 Warning: flock(): supplied argument is not a valid str... ADMINPLAY 2009.09.09 16812
31 PHPMyAdmin - blowfish_secret 해결방법 ADMINPLAY 2009.09.08 16550
30 php컴파일에러(flex) configure: error: cannot find out... ADMINPLAY 2009.08.08 16157
29 PHP - eAccelerator 설치 ADMINPLAY 2009.08.03 15054
Board Pagination Prev 1 2 3 Next
/ 3

Copyright ADMINPLAY corp. All rights reserved.

abcXYZ, 세종대왕,1234

abcXYZ, 세종대왕,1234