간혹 웹에서 보안상 쿠키를 없애고 세션만 사용하려는데 어떻게 해야하는지 문의가 올때가 있다. 결론부터 말하면 웹에서 쿠키 없이 세션만 사용할 수는 없다.
그 이유는 쿠키가 있어야만 세션이 존재하기 때문이다. 예를 들어 PHP서버를 운영하고 별도의 세션 설정을 하지 않았다면 세션 실행시 `PHPSESSID` 이라는 쿠키가 생성이 될것이다. 해당 쿠키값은 PHP세션 고유키값이 저장되어있으며 해당 쿠키가 있어야만 서버상 세션파일과 매칭하여 정상적으로 세션을 이용 가능하다.
갑자기 생각난건데 최근은 아니지만 몇년전 회사 클리이언트쪽 개발자가 연락이 와서 사이트에 쿠키를 없애는 작업을 하고 있다고 하였다. 그래서 `아 그러시구나` 라고 했는데 최종 문의내용은 `PHPSESSID` 쿠키가 계속 생성이 되서 이를 없애는 방법이 있는가 였다.
그래서 나는 현재 사이트 특성상 그걸 없애면 안되는것에 대해 설명을 해주었지만 끝내 이해하지 못하였고 그냥 원하는데로 session_start() 를 사용하지 않으면 되고 그대신 세션도 사용못한다고 답변을 해주었는데 몇일 뒤 다시 연락이 와서 사이트에 로그인이 안된다는 것이였다. 그렇게 몇분간 다시 설명을 해주었고 그뒤로는 두번다시 문의가 오지 않았다. |
흔히 쿠키대신 세션을 사용하라고 하는말도 쿠키를 모두 없애라는 말이 아닌 중요정보는 세션에 담고 쿠키는 인증키값으로만 사용하라는것이다. 하지만 쿠키가 탈취당하게 되면 모든 정보를 해킹당할 수 있는데 이는 인증토큰을 생성할때 DB에 아이피와 UserAgent 정보와 접속도메인정보와 함께 저장하여 해당 정보를 체크하게된다면 해킹을 막을 수 있다.
내가 웹을 처음 접했을 당시 세션은 어떤 방법으로도 탈취가 불가능할 거라는 착각에 빠져 중요한 정보를 모두 세션에 담아서 처리했었다. 그땐 보안에 대해 1%도 신경안쓰고 개발을 했었는데 어느날 서브 사이트를 보다보니 이상한게 발견이 되었다. 분명 A라는 메인사이트만 로그인을 했는데 B라는 서브사이트도 로그인이 되어있었다. 두 사이트간은 시스템이 모두 동일했었고 착각인가 하며 혹시 몰라 A의 메인사이트 관리툴에 로그인 후 B 서브사이트 관리툴을 접속해 보니 로그인이 되어있는게 아닌가.
착각이 아니란걸 깨닫게 되어 확인해보니 내가 실수한 부분이 있었다. 바로 세션 도메인 설정을 별도로 하였는데 이는 호스트(HOST) 단위가 아닌 도메인 단위로 하다보니 동일 도메인내 서브도메인은 모두 같은 세션을 공유하고 있었다. 이를 확인하여 바로 보안을 강화하였지만 역시나 보안을 위해서는 세션만으로는 처리할 수 없기에 DB에 중요정보를 함께 넣어 체크를 하게 되었다.
그렇다면 마지막으로 세션쿠키 `PHPSESSID` 가 탈취당하면 실제 어떤 일이 발생될 수 있는지 확인해 볼 수 있는 간단한 방법은 아래와 같다.
<?php
session_start();
$_SESSION['id'] = 'redinfo';
$_SESSION['pw'] = 'pw1234';
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
위와 같이 PHP 파일을 작성한뒤 브라우저에서 실행을 해보면 아래와 같이 세션에 저장된 값을 확인 가능하다.
Array
(
[id] => redinfo
[pw] => pw1234
)
이상태에서 크롬을 예로들어 F12를 누른뒤 Application 탭을 클릭하여 쿠키값중 아래 이미지와 같이 `PHPSESSID` 에 해당되는 값을 복사해 보자.
그런다음 작성한 소스코드상에서 아래와 같이 세션저장처리하는 부분을 주석처리해보자
<?php
session_start();
// $_SESSION['id'] = 'redinfo';
// $_SESSION['pw'] = 'pw1234';
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
기초준비는 끝났고 다른 브라우저 또는 크롬의 시크릿탭(ctrl+shift+n)을 열어서 브라우저를 다시 열어보면 아무값도 뜨지 않는것을 확인 가능하다.
Array
(
)
그럼 다시 F12를 눌러 복사한 `PHPSESSID` 에 대항되는 값을 붙여넣기 한뒤 새로고침을 해보면 `짜잔!` 아래와 같이 다른 브라우저에 저장된 세션정보를 확인 가능하다.
Array
(
[id] => redinfo
[pw] => pw1234
)
이처럼 쿠키가 탈취당하는 순간 쉽게 해킹을 당할 수 있기때문에 보안을 위해서 세션+DB 처리까지 해야하며 사용자가 작성가능한 게시판과 같은 곳은 반드시 내용을 출력할떄 스크립트를 실행할 수 없도록 처리하는게 중요하다.