달봉이가 근무하고 있는 곳에서 ASP.NET의 SessionID를 쿠키의 키로 이용하는 웹 어플리케이션이 있었다. 다음과 같은 구조에 문제가 없을까?
■ 상황
웹 어플리케이션 사용자 세션 정보를 쿠키에 저장하고 있었는데, 아래와 같은 구조였다.
[쿠키 키 : (사용자정보#1,값#1), (사용자정보#2,값#2),... (사용자정보#n,값#n)] 쿠키 키 : ASP.NET 세션 ID값을 사용 |
근데 이 키를 ASP.NET의 현재 Session ID로 지정하고 있었다. ASP.NET의 Session 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가 고정되지 않고 생성된 이후에도 재생성되어 변할 수 있다는 것이다(is generated 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
'IT 살이 > 04. 기술 - 프로그래밍' 카테고리의 다른 글
log4net 정리 & 예제 (1) | 2016.01.19 |
---|---|
.NET 어셈블리 로드 컨텍스트(최종이길 바라며...) (0) | 2015.10.15 |
어셈블리 바인딩(최종) (0) | 2015.10.15 |