세션 (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

그리구 나서 이 파일이름을 클라이언트에게 보내주고, 클라이언트는 이것을 쿠키로서 저장해 놓는다.

세션의 유지

  1. 세션을 사용한 브라우저에 메뉴의 "파일/새로만들기/창" 을 이용해 새창을 열거나 링크부분에서 오른쪽 마우스로 "새창에서 열기"로 새창을 열면 세션이 유지되어 있다.
  2. 현재 브라우저에서 주소표시줄에 같은 도메인의 다른 URL 을 쳐서 이동을 해도 세션이 유지
  3. 팝업창도 세션이 생성된 브라우저에서 열리면 그대로 세션이 유지된다.
  4. 익스플로어 아이콘을 통해 새창을 열면 현재 세션을 잃어 버리고 새로운 세션을 얻게 된다.
  5. 세션 유지 시간을 넘기면 자동으로 세션이 소멸된다. 세션을 생성한 페이지나 그이후에 페이지에서 유지시간동안 페이지 이동이 없다면 자동으로 세션이 소멸된다.
  6. 세션을 생성한 브라우저을 닫으면 세션도 소멸된다.

세션의 유지 시간

현재 설정된 세션 유지시간 보기

(단위:분)

<?= 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로 저장을 해서 공유하는 방법이 있다. 이건 세션핸들러 등으로 검색하면 잘 설명되어 있으니 그걸 참조하라.

누구나 수정하실 수 있다. 위키 사용법 참고하라.
1)
Database를 이용한 세션정보 공유의 이슈 서버들 사이에서 세션데이터를 공유하는 또 다른 방법은 세션정보를 데이터베이스에 저장하는 것이다. 이것은 NFS server 로 작업했을 때 발생하는 많은 데이터 보전과 보안 이슈를 해결 가능하게 한다. 그러나 여전히 아래에 설명된 몇 가지 이슈들로 인해 문내가 된다. 로컬세션 접근보다 현저하게 느려지는 현상에 덧붙여 database 에 세션데이터를 저장하는 것은 데이터베이스에 부가적인 스트레스를 주게 된다. 데이터베이스는 단 하나의 failure 포인트로 남게 될 것이며 데이터베이스에 세션데이터를 저장하는 것은 확장된 병목현상을 야기한다. (특히 클러스터의 확장성이 세션데이터를 제공하는 데이터베이스의 성능 뿐만 아니라 세션을 다루며 발생하는 로드에 의해 전체적으로 약화되는 데이터베이스의 성능에 의해서도 약화된다

역링크