세션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 를 포함하게 된다.
또는 세션이 시작된 경우 정의된 정수 SID 를 사용할 수도 있다. 클라이언트가 적당한 세션 쿠키를 송신하지 않은 경우 이 정수는 session_name=session_id 의 형식이 된다. 송신된 경우에는 빈 문자열이된다. 따라서 무조건적으로 URL 에 넣을 수 있다.
다음 예는 변수의 등록방법 및 SID 를 이용하여 다른 페이지로의 링크를 하는 방법
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 를 출력할 필요가 없다.
커스텀 세션 핸들러
세션 정보를 데이터베이스에 보존하거나 다른 보존방법을 구현하기위해서는 커스터마이즈된 보존 함수를 작성하여 session_set_save_handler() 를 사용해야 한다.
$_SESSION 의 키는 PHP 의 통상 변수명과 마찬가지로 제한이 있다. 즉 숫자로 시작할 수 없으며 문자 또는 언더스코어로 시작해야한다.
register_globals 가 무효인 경우 글로벌 배열 $_SESSION 의 멤버만 세션 변수로서 등록된다. 리스토어된 세션 변수는 배열 $_SESSION 에서만 사용할 수 있다.
보안과 코드의 가독성을 위하여 $_SESSION (또는 PHP 4.0.6 이전에서는 $HTTP_SESSION_VARS) 을 사용할 것을 권장하고있다. $_SESSION 의 경우 session_register(), session_unregister(), session_is_registered() 는 불필요. 사용자는 통상의 변수와 같이 세션 변수에 억세스 할 수 있다.
세션에서 변수 등록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 에 등록된 변수의 등록이 해제됨
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