세션 (Session)
서버는 클라이언트가 재접속 했을 때 해당 클라이언트를 구분할 수 있는 수단이 필요하다.
이렇게 클라이언트와 서버간의 상태를 유지하기 위한 일반적인 방법으로 세션이라는 개념을 이용한다. 클라이어트가 처음 접속했을 때 클라이언트에 유일한 세션 ID를 부여하게 되고 클라이언트는 이 ID를 자동으로 쿠키에 임시 저장하거나, 쿠키가 지원되지 않을 경우에 URL 끝에 붙여 가지고 다니게 된다.
당연히 서버에서도 같은 세션 ID를 보관하고 있어야 하며, 클라이언트는 서버에 요청을 할 때 부여 받은 세션 ID를 가지고 요청함으로써 서버는 클라이언트를 구분하게 된다. 그리고 서버에 보관된 세션 ID 하나당 메모리를 사용할 수 있게 되며 이 세션 메모리에는 ‘변수=값’의 형식으로 데이터를 보관할 수 있다.
세션은 Cookie의 단점을 보완하고자 만들어졌다.
세션 시작하기
<?php session_start() ?>
이렇게 세션함수를 호출하면 유저의 시스템에 이전에 발급된 유효 세션이 있는지 확인하게 되고, 검사결과 이전값이 없다면, 새로 세션아이디를 생성하고 이전에 발급한 아이디가 있고, 유효하다면, 서버에 저장한 데이터를 그대로 사용하게 되는 것 이다.
세션을 사용하기를 원하는 페이지에는 무조건 맨위에 sessioin_start()를 해줘야 한다. 이 함수를 호출하기 전에는 어떤한 함수의 실행결과나 html코드도 먼저 브라우저에 전송되어서는 안되며, 이 함수를 호출전에 다른 태그를 사용할 경우 에러가 난다.
$logid = "gagamel"; $passwd = "gozila"; session_register("logid"); session_register("passwd");
logid 같은 변수들의 값은 서버에 기록이 된다. 보통 파일로 기록이 된다.
이 경우 랜덤하게 유니크한 파일이름을 생성하여 /tmp
혹은 /var/lib/php5
에 저장이 된다.
sess_50fffa7e58f63c83ac0473fb928f17ed
그리구 나서 이 파일이름을 클라이언트에게 보내주고, 클라이언트는 이것을 쿠키로서 저장해 놓는다.
세션의 유지
- 세션을 사용한 브라우저에 메뉴의 "파일/새로만들기/창" 을 이용해 새창을 열거나 링크부분에서 오른쪽 마우스로 "새창에서 열기"로 새창을 열면 세션이 유지되어 있다.
- 현재 브라우저에서 주소표시줄에 같은 도메인의 다른 URL 을 쳐서 이동을 해도 세션이 유지
- 팝업창도 세션이 생성된 브라우저에서 열리면 그대로 세션이 유지된다.
- 익스플로어 아이콘을 통해 새창을 열면 현재 세션을 잃어 버리고 새로운 세션을 얻게 된다.
- 세션 유지 시간을 넘기면 자동으로 세션이 소멸된다. 세션을 생성한 페이지나 그이후에 페이지에서 유지시간동안 페이지 이동이 없다면 자동으로 세션이 소멸된다.
- 세션을 생성한 브라우저을 닫으면 세션도 소멸된다.
세션의 유지 시간
현재 설정된 세션 유지시간 보기
(단위:분)
<?= session_cache_expire(); ?>
세션 유지시간 설정하기
<?php //# session_start() 전에 사용해야함\ //# 세션유지시간:30분 설정 session_cache_expire(30); session_start(); ?>
세션에 내용 등록
session_start() $_SESSION["nme"]="sunz"; $_SESSION["id"]="sunz";
세션 등록과 대입이 1단계이다. 이 방법은 서버의 register_globals 설정이 on이나 off인 상태에서도 사이트가 잘 돌아간다.
세션의 변수 삭제
session_unregister("변수"); //변수값만 지운다 session_unset("변수"); //현재 변수의 값을 삭제하고 변수도 소멸시키는 함수
session_is_registered("string name") //세션 변수가 현재의 세션에 등록되어 있는지를 반환
세션 공유
php.ini /etc/php5/apache2/php.ini
혹은 /etc/php5/fpm/php.ini
에 보면 세션의 기본 설정은
session.save_handler = files ; 저장방식은 파일로 (db도 가능) session.save_path = /tmp ; 위치는 /tmp session.name = PHPSESSID ; 쿠키로 발행될 쿠키변수 이름 session.cookie_path = / ; 쿠키가 유효한 디렉토리 session.cookie_domain = ; 쿠키가 유효한 도메인인데 기본은 비어있다
요렇게 되어 있다. 그래서 디폴트 상태로 세션을 쓰게 되면 쿠키로 발행된 세션의 파일이름은 현재의 도메인에만 먹게 된다.
session.cookie_domain = .vaslor.net;
이렇게 해당 도메인을 넣어주면 쿠키로 발행된 PHPSESSID 는 .vaslor.net 의 모든 서버에서 먹게 된다… ( 점이 반드시 필요) 만약 물리적으로 같은 서버인데 도메인만 틀릴 경우에는 이렇게만 해도 된다. (아파치 (혹은 엔진엑스)와 php5를 재시작해주는 것을 잊지말 것.)
session.save_path = /tmp ;
그러나 서버가 다르다면 문제가 있다.
이럴땐 nfs 등의 디렉토리 공유 방법을 써서 그쪽 디렉토리 이름으로 지정을 하거나, 세션을 아예 db로 저장을 해서 공유하는 방법이 있다. 이건 세션핸들러 등으로 검색하면 잘 설명되어 있으니 그걸 참조하라.
누구나 수정하실 수 있다. 위키 사용법 참고하라. |
---|