Creative Commons License

Community

공지/뉴스
지식공유
질문/답변
자료실
자유로운 글
방명록

공유를 넘어 교류로... 제가 알리는 말씀 및 사이트 이용자들이 함게 참여하는 커뮤니케이션 공간입니다.

.

지식공유

여러분들의 개발 관련 기술이나 팁을 공유해 주세요~ 자신이 가진 작은 팁 하나가 어떤이에게는 몇 일을 삽질하게 만드는 것일 수 있습니다 ^^

브라우저 종료시 이벤트 처리 문제

작성자 허둥9단
작성일 2008-11-24 오후 5:04:32,    조회수 : 2880

1. 문제현상

 

1) 구글에서 네이버를 검색합니다.

2) 검색결과에 네이버가 나오면 클릭합니다.

3) 새창으로 네이버가 뜰 때 로그인합니다.

4) 브라우저를 종료합니다.

5) 구글 브라우저에서 다시 네이버를 클릭합니다.

6) 네이버가 인증 상태로 존재합니다.

7) 다시 네이버를 종료한 후 구글 브라우저에서 주소창에 네이버로 이동합니다.

8) 네이버가 인증 상태가 됩니다.

 

2. 요구사항

 

문제현상에서 검색 사이트에서 바투 사이트로 왔을 경우를 가정했을 때 브라우저를 종료했을 경우에만 로그아웃 처리시키는 것입니다.

 

3. 원인

 

브라우저는 클라이언트 프로그램입니다.

Iexplorer.exe 파일이 브라우저의 실행파일명입니다.

Iexplorer.exe를 실행하면 모든 쿠키정보 외의 방문한 브라우저 정보들을 관리합니다.

네이버에서 로그인하고 다른 사이트로 갔다가 다시 네이버로 가면 로그인 되어 있는 이유가

하나의 Iexplorer.exe 에서 담당하기 때문입니다.

새로 브라우저를 실행하면 두 개의 iexplorer.exe가 실행됩니다.

이 브라우저는 기존의 브라우저와 독립적입니다.

문제현상에서 나타났던 원인이 바로 하나의 iexplorer.exe에서 수행하기 때문입니다.

 

4. 분석

 

요구사항에서 봤듯이 브라우저를 종료하는 시점에 이벤트만 캐치한다면 처리가 가능합니다.

우선 window 이벤트 스크립트에 onbeforeunload 이벤트가 있습니다.

이 이벤트는 웹 페이지가 언로드 되기 직전에 발생합니다.

여기서 알아야 할 내용은 웹 사이트는 비 연결성입니다.

클라이언트에서 서버에 요청을 보내면 서버에서 응답을 받아 처리한 후 클라이언트에 정보를 전송해 주고 연결을 끊어버립니다.

그렇기 때문에 종료할 때도 onbeforeunload 이벤트가 발생하지만 새로고침, 앞으로, 뒤로, 이동 시에도 발생합니다.

결국 onbeforeunload 이벤트에서 종료했을 경우만을 캐치해서 처리해줘야 합니다.

이런 전제 조건을 가지고 구글, 네이버, 엠파스 등 국내외 여러 사이트에서 검색을 해봤습니다.

아쉽게도 웹 기술로만 완벽히 처리하는 방법이 없는 듯 보입니다.

결국 꽁수로 처리하는 방법들이 많이 검색되었는데 대충 아래 내용들입니다.

 

1) Event.ClientY 값이 음수라면 처리.

2) AJAX 5초나 10초마다 서버와 통신하여 클라이언트의 반응여부로 처리.

3) x 버튼의 좌표값을 계산(?)하여 마우스가 x 버튼에 있을 경우에만 처리.

 

이 외에도 어처구니 없는 꽁수들이 많았으나 여기까지만 쓰겠습니다.

 

처리 결과로만 봤을 때 위 3가지 방법 중 그나마 AJAX로 통신하여 반응여부로 처리하는게 제일

깔끔해 보이지만 서버의 부하가 불가피한 상황입니다.

첫번째 방법은 마우스가 해당 영역에 있을 때 새로고침을 해도 종료로 인식하는 버그가 생기게 됩니다.

세번째 방법이 버그 발생률이 그나마 적어 보이지만 사용자가 x버튼에 마우스를 대고 새로고침하거나, altF4, ctrlF4, 작업관리자에서 종료할 경우 버그가 발생합니다.

 

예전에 사이트를 벗어날 경우 종료하시겠습니까? 라는 메시지를 본 기억이 있는데,

흔히 블로그에서 포스트를 쓰던 중 이동하게 되면 페이지를 벗어나시겠습니까? 라는 메시지가 떳었다. 이는 종료해도 뜨고 새로고침해도 뜨는 상황이었기 때문에 처리방식이 되지 못합니다.

 

그 외에 브라우저 호환성과 특정 버전의 브라우저만 지원이 되는 것은 있었으나 필자의 버전이 IE7 버전이라 테스트 결과 제대로 수행하지 않았습니다.

 

ActiveX를 사용하게 되면 iexplorer.exe 프로세스를 제어할 수 있기 때문에 종료가 가능하지만 이 기능을 위해 ActiveX를 구현해야 하는지는 의문입니다.

 

5. 해결방안

 

결국 생각하기에 두 가지 방법 중 하나로 결정해야 할 것 같습니다.

이 현상을 보안상 심각한 결과로 받아들인다면 ActiveX로 구현하여 처리해야 할 것이고,

브라우저의 특성으로 여긴다면 특별한 처리 없이 이대로 가야 할 것입니다.

사실 생각해보면 이 현상은 당연한 결과이고 버그라 보기 어렵습니다.

보안상 어떤 문제점이 있을지 생각해보게 되는데 사용자가 브라우저를 닫지 않고 나가버렸을 경우 다른 악의가 있는 사용자가 악의적인 목적으로 사용할 수 있겠습니다.

은행권 사이트들은 돈과 관련되어 보안상 매우 중요한 이슈가 되겠으나(은행권 사이트는 ActiveX로 구현한다고 함) 바투 사이트의 성격을 고려했을 때 이렇게 할 필요가 있는지도 의문입니다.

이름
비밀번호
홈페이지
EB <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요