PHP 세션 - 예

세션ID 전달

세션 ID 를 통지하기 위해서는 다음의 두가지 방법이 있다. 

  • Cookies
  • URL 파라미터

session 모듈은 위 두가지방법을 지원한다.  Cookie 가 최적이지만 (클라이언트가 쿠키를 사용할 수 없는 경우가 있기에 ) 신뢰성이 없어 쿠키에만 의존할 수 없다.  2번째의 방법은 세션ID 를 직접 URL 에 포함시키는것이다. 

PHP 에는 자동적으로 링크를 바꾸는 기능이 있다. PHP 4.2.0  이후를 사용하고 있지 않는 경우  PHP 구축시에 이 기능을 유효화 시켜야 한다.  UNIX 환경에서는  --enable-trans-sid를 configure 에 지정할것.
이 옵션과 실행시의 옵션 session.use_trans_sid 가 유효한 경우 상대 URI 은 자동적으로 세션 ID 를 포함하게 된다. 

주의 : arg_separator.output php.ini  디렉티브에 따라 파라미터 구분자 를 커스터마이즈 할 수 있다. XHTML을 제대로 따르기위해서는 여기에 & 를 지정할 것

또는 세션이 시작된 경우 정의된 정수 SID 를 사용할 수도 있다.  클라이언트가 적당한 세션 쿠키를 송신하지 않은 경우 이 정수는 session_name=session_id 의 형식이 된다.  송신된 경우에는  빈 문자열이된다. 따라서 무조건적으로 URL 에 넣을 수 있다. 


다음 예는 변수의 등록방법 및 SID 를 이용하여 다른 페이지로의 링크를 하는 방법

<?php

session_start
();

if (empty(
$_SESSION['count'
])) {
 
$_SESSION['count'] = 1
;
} else {
 
$_SESSION['count'
]++;
}
?>

<p>
Hello visitor, you have seen this page <?php echo $_SESSION['count']; ?> times.
</p>

<p>
To continue, <a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">click
here</a>.
</p>


XSS 와 관련된 공격을 막기위해 SID 를 출력할때  htmlspecialchars()를 사용한다.

PHP를 컴파일할때  --enable-trans-sid 를 사용한 경우 위 예처럼 SID 를 출력할 필요가 없다. 

주의 : 상대URL 이 아닌 URL 은 외부사이트를 가리킨다고 가정하여 SID 가 추가되지 않는다.  SID 를 외부 서버로 넘겨주는것이 보안상 리스크가 생기기 때문이다. 


커스텀 세션 핸들러

세션 정보를 데이터베이스에 보존하거나 다른 보존방법을 구현하기위해서는 커스터마이즈된 보존 함수를 작성하여  session_set_save_handler() 를 사용해야 한다.


주의 : PHP 4.1.0 이후 $_SESSION $_POST , $_GET , $_REQUEST   처럼 글로벌 변수로 사용가능해졌다. $HTTP_SESSION_VARS 와 달리  $_SESSION 은 항상 글로벌이다.  global$_SESSION 에게는 필요 없음.  $_SESSION 을 사용하기 전에  session_start() 를 사용하여 세션을 개시하여야 한다는 사실에 주의할 것.
 
$_SESSION 의 키는 PHP 의 통상 변수명과 마찬가지로 제한이 있다. 즉 숫자로 시작할 수 없으며 문자 또는 언더스코어로 시작해야한다. 

register_globals 가 무효인 경우 글로벌 배열 $_SESSION  의 멤버만 세션 변수로서 등록된다. 리스토어된 세션 변수는 배열 $_SESSION 에서만 사용할 수 있다. 

보안과 코드의 가독성을 위하여  $_SESSION (또는  PHP 4.0.6 이전에서는 $HTTP_SESSION_VARS) 을 사용할 것을 권장하고있다. $_SESSION  의 경우 session_register(), session_unregister(), session_is_registered() 는 불필요. 사용자는 통상의 변수와 같이 세션 변수에 억세스 할 수 있다. 

세션에서 변수 등록
<?php
session_start
();
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
if (!isset($_SESSION['count'
])) {
 
$_SESSION['count'] = 0
;
} else {
 
$_SESSION['count'
]++;
}
?>


register_globals 가 무효한 경우 $_SESSION 에 등록된 변수의 등록이 해제됨

<?php
session_start
();
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
unset($_SESSION['count'
]);
?>


경고 

unset($_SESSION) 로  모든 $_SESSION 을 초기화해서는 안됨. $_SESSION 수퍼글로벌 변수를 이용한 세션 변수의 등록이 불가능해지기 때문이다. 


경고

세션 변수에서는 참조를 사용할 수 없다. 다른 변수에의 참조를 리스토어 할 방법이 없기때문이다.


register_globals 가 유효한 경우 모든 글로벌 변수는 세션 변수로서 등록할 수 있고 세션 변수는 대응하는 글로벌 변수로서 리스토어 할 수 있다. PHP 는 어떤 글로벌 변수가 세션 변수로서 등록되는지를 알아야 하기에 사용자는 변수를 session_register() 함수로 등록해야 한다.  그러나 $_SESSION 의 경우 엔트리를 설정하여 함수등록과 같은 기능을 한다.

경고

PHP 4.3.0 이전 버젼에서는 $_SESSION 을  사용하여 register_globals 을 무효화하는 경우  session_register() ,  session_is_registered() , session_unregister() 을 사용하지않도록... 보안상 , 그리고 성능면에서 register_globals 을 무효화 하는 쪽을 권장함.


register_globals 가 유효한 경우 글로벌 변수와 $_SESSION 의 엔트리는 이전의 세션 인스턴스에서 등록된 세션 변수의 같은 값을 참조하게 된다.  그러나 변수가  $_SESSION 에서 등록된 경우  글로벌 변수가 사용가능하도록 되는것은 다음 리퀘스트 이후가 된다.

PHP 4.2.3 와 그 이전버젼에서만 일어나는 트러블중에  session_register() 로  새 세션 변수를 등록할 경우 글로벌 스코프의 엔트리와 $_SESSION 의 엔트리는 다음 session_start() 까지 같은 값에의 참조는 되지 않는다.  즉 , 글로벌 변수의 수정은 $_SESSION 의 엔트리에는 반영되지 않는다. PHP 4.3.0 에서는 수정되었음.


원문링크 : http://www.php.net/manual/en/session.examples.php