본문 바로가기

IT 살이/04. 기술 - 프로그래밍

ASP.NET Session ID 특성

달봉이가 근무하고 있는 곳에서 ASP.NET의 SessionID를 쿠키의 키로 이용하는 웹 어플리케이션이 있었다. 다음과 같은 구조에 문제가 없을까?


■ 상황


웹 어플리케이션 사용자 세션 정보를 쿠키에 저장하고 있었는데, 아래와 같은 구조였다. 


 [쿠키  : (사용자정보#1,값#1), (사용자정보#2,값#2),... (사용자정보#n,값#n)]

쿠키 키 : ASP.NET 세션 ID값을 사용


근데 이 키를 ASP.NET의 현재 Session ID로 지정하고 있었다. ASP.NET의 Session ID를 쿠키의 키로 지정하는 예는 처음 보았다. 이 코드가 문제가 있다는 것을 설명하기 위해서 구글링을 해 봤다.


■ 분석


사용자가 ASP.NET 어플리케이션에 대한 요청을 하면 아래와 같이 상태 관리를 위한 세션 객체와 그 객체를 구분하기 위한 ID가 생성된다. 

1) ASP.NET Request , User#1   --> 세션 상태 관리용 객체  Session#1 생성, Session ID = #S1

2) ASP.NET Request , User#2   --> 세션 상태 관리용 객체  Session#2 생성, Session ID = ?


ASP.NET 세션 객체에는 타임아웃이 존재하는데, 기본적으로 20분동안 동일한 사용자가 접속을 하지 않게 되면 해당 세션 객체는 해제된다. 각 사용자의 세션 객체는 Session ID를 가지고 있다. 이 Session ID는 "120 비트 숫자로서 서버의 RAM에서 생성"된다.

여기서 문제는 쿠키의 키로 사용하고 있는 Session ID가 고정되지 않고 생성된 이후에도 재생성되어 변할 수 있다는 것이다(igenerated in RAM on the server and not a persistent property). 


1) 세션 타임아웃 발생 & 세션#1 상태 변화 없음


Session #2의 Session ID=#S1 


2) 세션 ID의 변동성

생성 당시에는 고유. 그러나 시간이 경과하면 변경될 수 있음

예를 들어 IIS가 시작되면, renumbering을 통해서 Session ID 가 변경될 수 있다.

즉 아래와 같은 상황이 발생하지 않을 것이라고는 아무도 장담하지 못한다. 


User #1 --> Session #1, Session ID = #S2

User #2 -->Session #2, Session ID = #S1,


■ 결론


ASP.NET의 Session ID는 세션별로 계속 고유하지 않을 수도 있다는 것이고, 이런 값을 쿠키의 키로 사용하는 것은 문제가 있다는 것이다. 


참조)

How and why session IDs are reused in ASP.NET

https://support.microsoft.com/en-us/kb/899918


Session.SessionId is *not* unique

http://weblogs.asp.net/bsimser/228713