본문 바로가기

web

PHP Session 저장 원리


PHP에서 실제로 Session이 Server 측에 어떤 형식으로 저장되는지 알아보겠습니다. 먼저 쿠키와 세션에 대한 정의는 너무나도 잘 알려 있기 때문에 생략합니다. 간단하게 한 줄로 요약해 보라고 한다면 다음과 같이 적고 싶습니다.



  쿠키(Cookie) : 서버 측에서 클라이언트 식별 정보를 웹 브라우저에 전달하여 세션 관리

  세션(Session) : 쿠키가 사용자 웹 브라우저에 저장되어 발생하는 단점을 극복하기 위해 서버 측에 정보를 저장



먼저 Session을 발생시켜야 하기 때문에 아래와 같은 간단한 Login 절차를 구현해야 합니다.


1
2
3
4
5
6
7
8
9
10
11
Login
.
.
.
 
<?
session_start();
$_SESSION['user_id'= $user_id;
$_SESSION['user_name'= $user_name;
?>
<meta http-equiv='refresh' content='0;url=main.php'>
cs

Login이 정상적으로 이루어 지면 $user_id 와 $user_name을 $_SESSION의 변수로 등록합니다. 보통 이런식으로 세션이 구현 됩니다.
그러면 본격적으로 이 Session이 Server 측과 Client 측에 어떤 식으로 저장되는지 알아보도록 하겠습니다.

먼저 Session이 개시되었을 때 Client 측의 Browser에는 다음과 같이 PHPSESSIONID라는 세션 토큰이 생기게 됩니다.


그리고 Server 측에서는 특정 디렉터리 밑에 다음과 같이 Client 측의 Browser와 동일한 PHPSESSIONID에 "sess_"이라는 문자열을 추가한 파일이 생성됩니다.




  해당 파일의 위치는 Windows OS에서 APM Default 설정일 때 /sbin/tmp/session 디렉터리 아래에 저장되어 있습니다. 

  해당 파일의 경로는 아래 그림과 같이 php.ini 설정파일에서 수정할 수 있습니다. 



  또는 다음과 같이 php 환경설정을 변경할 수 있는 ini_set() 함수를 사용하여 임의적으로 변경할 수도 있습니다.

      

                                              ini_set("session.save_path""./sessions/");




다시 본론으로 돌아와서 Server 측에 저장되어 있는 세션 파일은 다음과 같은 구조로 되어 있습니다.



위 Login 과정에서 발생시켰던 Session 변수명과 해당 값이 들어 있고, 각 변수명은 ;(세미콜론) 으로 구분되어 있습니다.

그리고 서버 환경 설정에서 Session 타임 아웃이 지정되어 있지 않다면 session_destory(); 함수가 호출되기 전까지 파일이 계속 남아 있습니다.


만약 Server 측의 Session 저장 디렉터리에 접근이 가능하다면 해당 PHPSESSIONID를 공격자 Browser에 입력하면 해당 계정의 권한을 얻게 될 것입니다.



'web' 카테고리의 다른 글

[SQL] MySQL 대소문자 구분  (1) 2016.02.02
[SQL] SELECT Query 특성에 따른 SQL Injection 기법  (2) 2016.01.22
[SQL] MySQL Automatic Type Cast  (0) 2016.01.19