업무중 해당 이슈를 해결하라는 요청이 들어와서 이틀간 웹서핑을 했다.
이슈를 요약하자면,
IE8부터는 예전과 달리 명시적으로 "새로운 세션"으로 창을 띄우지 않는 한,
모든 창과 탭이 동일한 세션을 공유할 수 있다.
따라서 이용자가 로그아웃을 하지 않고 창만 닫은 경우, 여전히 세션이 남아있어
다른 사용자가 기존의 세션 정보를 이용하여 악용할 소지가 있다.
클라이언트 측에서 세션을 공유하지 않도록 하는 해결 방법은 많이 알려져 있다.
- 사이트에서 제공하는 로그아웃 버튼을 이용하여 명시적으로 종료하여 세션을 끝낸다.
- 파일메뉴에서 New Session 을 선택하여 새로운 세션으로 시작한다.
- iexplore.exe 실행시 인자로 -noframemerging 를 추가하여 실행시킨다. (-nomerge 옵션은 Deprecated 됨)
- Registry key 수정 : HKCU\Software\Microsoft\Internet Explorer\Main\FrameMerging
0 - disable frame merging , 1 – enable (default)
그럼 서버측은?
찾아본 자료는 세가지 방법을 설명하고 있었다.
1. 클라이언트 웹 세션 관리기법 : 특정 프레임에 로그인시 인자값을 할당하여 해당 인자값 유무를 체크 -> 복수프레임일 경우에만 적용 가능
2. 보안세션을 파라미터로 관리 : 보안세션에 사용되는 세션 키 값을 페이지 이동시마다 파라미터로 전달 -> 단일프레임일 경우에 적용가능, 세션키 암호화 필요 , 세션관리방식 변경이 필요함
(웹 세션 키는 쿠키로, 보안세션키는 request parameter로 전달하여 관리)
3. 보안모듈을 이용하여 프로세스 추적/제어 -> 완벽한 추적은 불가능함 , 보안모듈 개발 추가비용 발생, 장애 RISK
내가 적용한 방식은 1)과 유사한데, 프레임이 필요하지는 않다.
아이디어는 IE에서 제공하는 DOM Storage에서 시작한다.
single tab의 lifetime 을 따르는 window.sessionStorage 를 활용하기로 했다.
흐름을 기술하자면 아래와 같다.
1. 로그인 시점에 sessionStorage 를 저장한다. (로그인 후)
2. 로그인 체크가 필요한 모든 페이지 내에서 sessionStorage를 체크한다.
3. 만약 sessionStorage 정보가 없는데도 서버세션이 있다면, 다른 탭이거나, 새창이라고 판단하여
세션정보를 제거하고, 최초페이지로 이동한다.
cf) 팝업의 경우에는 적용하기 어렵다....
cf) 단점은... 기존 창까지 세션아웃된다는거. (물론 피할 수도 있겠지만, 귀찮아서 패스.. )
- // 로그인 시 저장하기
- if(navigator.userAgent.indexOf("MSIE 8") == 25 ){
- sessionStorage.login = "lepffm";
- }
- // 로그인후 체크하기
if(session!=null){ - if(navigator.userAgent.indexOf("MSIE 8") == 25 ){
- if(sessionStorage.login == null){
- document.execCommand("ClearAuthenticationCache",false);
- top.document.location.href = '/';
- }
- }
- }
참고사이트
http://blogs.msdn.com/b/ie/archive/2009/05/06/session-cookies-sessionstorage-and-ie8.aspx
http://msdn.microsoft.com/en-us/library/ee330728(VS.85).aspx
http://msdn.microsoft.com/en-us/library/cc197062(v=VS.85).aspx
http://byung.egloos.com/4970548
이 글은 스프링노트에서 작성되었습니다.