세션
- 세션은 HTTP 프로토콜의 특성상 여러번의 접속에 대해 일관된 작업을 보장해주는 서버쪽 개체를 말합니다.
세션의 세부사항
- 세션은 쿠키의 TSSESSION 이라는 키에 저장된 값을 세션 아이디로 사용하여 구별합니다.
- 세션은 Sessions 테이블에 하나의 레코드로 생성이 되며 다음과 같은 필드들을 갖습니다.
id 세션 아이디 address 사용자의 IP 주소, 세션아이디를 확인하기 위한 최소한의 보안장치 userid 로그인 사용자의 경우 해당 Users의 userid, 손님의 경우 NULL, 오픈아이디의 경우 -1 preexistence 사용하지 않습니다 data 직렬화된 세션 개체 server 마지막 요청의 $_SERVER[ 'HTTP_HOST' ] request 마지막 요청의 $_SERVER[ 'REQUEST_URI' ] referer 마지막 요청의 $_SERVER[ 'HTTP_REFERER' ] timer 마지막 요청이 시작하고 끝날때까지 경과한 시간 (단위:초) created 생성된 시각 updated 마지막 방문시각
세션의 일생
- 최초 접속시, TSSESSION 값이 비어 있으므로, 하나의 손님 세션(Anonymous Session)이 만들어집니다.
- 만약, 사용자의 IP 주소로 할당된 손님 세션 아이디가 존재하면 만들지 않고 그 아이디를 재사용합니다. 즉, TSSESSION이 없을지라도, 같은 세션을 유지하게 됩니다.
- 이런 이유로, 다른 브라우져라할지라도 손님세션의 경우 공유하게 됩니다.
- 그러나, 같은 IP를 공유하는 공유기 안에서는 손님세션의 경우 데이터 교환이 생길 수 있는 문제점이 존재합니다.
- 로봇의 경우 해당 사이트마다 하나의 세션을 만들므로, 쿠키를 사용하지 않는 로봇이라도, 여러 요청을 하나의 세션으로 처리합니다.
- 세션 아이디가 누출되어도 같은 IP에서 접속되지 않으면, 세션을 가로챌 수 없습니다.
- 관리자 로그인이 성공적으로 이루어지면, 세션아이디가 새로이 할당됩니다. 마찬가지로 관리자 세션이 로그아웃되면 해당 세션 레코드는 삭제됩니다.
- 관리자의 경우 IP에 따른 재사용을 하지 않습니다. 따라서, 손님의 경우 IP가 같은 경우 공유하지만, 관리자의 경우 독립된 세션을 할당하게 됩니다.
테스트 항목
- 세션관련 문제를 디버깅할 때는 다음과 같은 시험을 해 보면 됩니다.
- config.php 에 다음과 같은 설정을 하면, 맨 아래에 세션 변수들을 볼 수 있습니다.
$service['debug_session_dump'] = 1; $service['enableDebugMode'] = true;
- FF, IE 로 손님 접속을 합니다.
- 두 세션 아이디는 모두 같게 나와야 정상입니다.
- FF 로 손님 오픈아이디 로그인을 합니다.
- FF에는 새로운 세션 아이디가 할당되어 오픈아이디 세션이 만들어지는 것이 정상입니다.
- IE에는 로그인하는 중간 만들어진 쓰레기 데이터가 있을 수 있습니다만, 이것을 이용하여 로그인을 계속할 수는 없습니다.
- 이어서, FF 로 이메일로된 관리자 로그인을 합니다.
- FF의 세션 아이디는 유지되며, 관리자 권한을 얻습니다. 오픈아이디는 로그아웃됩니다.
- 이어서, FF 로그아웃을 합니다.
- 세션은 삭제됩니다. DB에서 확인할 수 있습니다.
- IE와 같은 세션 아이디를 획득하게 됩니다.
- 이어서, FF 로 관리자와 연결된 오픈아이디로 로그인을 합니다.
- FF는 새로운 세션 아이디를 얻으며, 관리자 권한과 오픈아이디를 모두 얻습니다.
