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 |
그리고 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 |