세션이 엉켜 문제가 발생할 경우가 있습니다.
방법 1 : 페이지 코드 수정
<?
session_start(); //이 문장은 맨위에 들어가야함
$board_name = "게시판의 이름"; //이것은 게시판들의 중복을 막기위한 값입니다. //예를들어 자유게시판 1번글을 읽었는데 //공지사항 1번글을 읽었을때도 조회수 중복이 막히면 안돼겠죠??
$id = "게시판글의 고유번호"; //이것이 있어야 어떤글을 읽었는지 조사할 수 있겠죠?
session_register("cnt_list"); //어떤 게시물을 봤는지 저장할 세션입니다.
$cnt_list_dummy = explode(";",$cnt_list); //현재 세션에 있는 내용을 조각냅니다. $board_cnt_ok = 0; //조회수를 올려도 되는지 저장하는 변수를 초기화합니다. for($i = 0; $i < sizeof($cnt_list_dummy); $i++)
{
if($cnt_list_dummy[$i] == $board_name."_".$id) //조각낸 게시물과 일치하는 세션값이 있는지 검사합니다. {
$board_cnt_ok = 1; //만약 있다면 현재글을 이미 읽다다는 표시를 해둡니다. 저는 0과 1로 표현했어요~ break; //반복문을 멈춥니다. }
}
if($board_cnt_ok == 0) //검사한 값에 조회한적이 있는지 검사합니다. {
//만약 이글을 처음 조회하는것이면 아래를 실행합니다.
/*여기에는 조회수를 +1하는 소스를 넣어두세요.
프로그램 짜시는 분마다 다르기 때문에 이부분은 생략입니다^^;*/ $cnt_list .= ";".$board_name."_".$id;
}
?>
//만약 이글을 처음 조회하는것이면 아래를 실행합니다.
/*여기에는 조회수를 +1하는 소스를 넣어두세요.
프로그램 짜시는 분마다 다르기 때문에 이부분은 생략입니다^^;*/ $cnt_list .= ";".$board_name."_".$id;
}
?>
방법2 : 익스플로러 실행코드 변경
-nomerge : IE세션미공유 (IE8, IE9를 사용하여 웹 사이트에서 로그인 후 새로운 Internet Explorer 창을 열고 동일한 웹 사이트로 이동하면 이미 로그인된 상태로 웹 사이트가 열릴 수 있다. 사용자의 편의성을 높이기 위해 프로세스 간 쿠키를 공유할 수 있는 기능인데 이러한 기능을 원하지 않는 경우 -nomerge 옵션으로 IE를 실행시키면 된다.)
세션미공유 관련 레지스트리를 직접 수정할 수 있다.
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
"FrameMerging"=dword:00000000
"FrameMerging"=dword:00000000
※ IE 다른 옵션
-private : InPrivate 모드 (InPrivate 모드를 사용하면 웹서핑에서 사용하던 세션의 데이터가 저장되지 않는다. 쿠키, 방문한 웹페이지 주소, 임시인터넷파일이 브라우저를 닫으면 삭제된다.)
-k pageurl : kiosk 모드 (키오스크 모드에서 Internet Explorer를 실행하면 Internet Explorer 제목 표시줄, 메뉴, 도구 모음 및 상태 표시줄이 표시되지 않으며 Internet Explorer는 전체 화면 모드에서 pageurl을 실행함. 메뉴를 사용하기위해서는 단축키를 사용해야 한다.)
부록.
IE8의 LCIE Design은 기존의 IE7의 Design과 비교해서 본다면 이렇게 말할 수 있겠다. 일단, IE process Model이 기존에 ieuser.exe, 이것은 Protected-mode Broker Object가 포함되어 있는 것으로 실제 UI와 우리가 IE라고 믿는 것들, - UI Frame이나 Tab, Toolbar Extensions, Browser Helper Objects 그리고, ActiveX Control 까지, - 이 분리된 상태로 존재한 것이 IE7이었다. 이는 보안모델로 인하여 소위 말하는 Integrity level을 ieuser.exe는 Medium level로 그리고, 기타 나머지 것들은 Low level로 만들었었다. 하지만, IE8는 이 구조를 조금 바꾸었다. Iexplore.exe process를 초기 2개 띄우도록 만들고, 하나의 IE process에는 기존의 ieuser.exe 것들과 UI frame을 포함시키고, 그 외 나머지들은 Tab process라고 두었다. 큰 변화는 UI frame이 Medium level의 iexplore process에 포함된 것이고, Tab process는 분리되도록, Tab간 별도의 Process로 분리했다. 이는 확실히 하나의 TAB process에서 3rd party extension에 의한 Crash로부터 IE process를 보호하는 역할을 할지 모르겠다. (여기 그림과 같이 직관적으로 LCIE Model을 확인할 수 있다. http://blogs.msdn.com/ie/archive/2008/03/11/ie8-and-loosely-coupled-ie-lcie.aspx )
말하고자 하는 것은 Session에 대한 문제이다. IE8의 LCIE Design에 기인해서인지 몰라도 File Menu에 New session을 Click하면 예상하다시피 New browser windows가 열린다. 이는 말 그대로 기존의 ieexplore.exe와 Session을 공유하지 않기 때문에 만일, 동일한 Site에 다른 user로 로그온하여 Browsing 을 할 수 있는 기능을 제공한다. 반면에, File Menu에서 New window, New Tab 또는 Duplicate Tab을 Click하거나 Desktop Shortcut으로 new tab이나 window가 open이 된다면, 이는 원래의 Session을 공유하여 사용하게 된다. 이러한 기능이 Session merging 기능이다. 이는 registry key나 command 수행 시 option을 통해서 다음과 같이 제어할 수 있다.
- Registry key
HKCU\Software\Microsoft\Internet Explorer\Main\FrameMerging
0 - disable frame merging , 1 – enable (default) - Command-line switch : If the application is being launched via a desktop shortcut, the command line switch “-noframemerging” could be added to that to get the desired effect. –FrameMerging option is default.
- Menu item (“File->New Session”)
(Merging에 대해서는 http://blogs.msdn.com/askie/archive/2009/05/08/session-management-within-internet-explorer-8-0.aspx 를 참조한다. )
문제는 많은 업체들이 ActiveX Control을 통해서 Session을 유지시키고 Authenticated Popup창이 open되는 것을 막아왔다는 것이다. IE8에서의 Tab process가 분리되는 것에서 언급했지만, ActiveX Control도 Tab Process가 분리됨에 의해서 Process간의 Session정보를 공유할 수 없게 되었다는 것이다. 그러므로 이러한 시나리오에서 Session을 유지하기 위해서는 IE-Extension단에서의 Re-design이 되거나 LCIE Model에 대한 포기가 있을 수 있을 것 같다.
HKCU\Software\Microsoft\Internet Explorer\Main – TabProcGrowth
- TabProcGrowth=0 : tabs and frames run within the same process; frames are not unified across MIC levels.
- TabProcGrowth =1: all tabs for a given frame process run in a single tab process for a given MIC level.
TabProcGrowth 는 TAB Process를 1개로 유지시킴으로써 TAB Process간 Session공유에 대한 고민을 해결해 줄 수 있지만, 과거의 Design으로의 회귀라는 측면에서 안타깝다. (참조: http://blogs.msdn.com/askie/archive/2009/03/09/opening-a-new-tab-may-launch-a-new-process-with-internet-explorer-8-0.aspx ) 그 외에 Design의 변경에 대해서는 DOM storage (참조: http://msdn.microsoft.com/en-us/library/cc197062(VS.85).aspx ) 중의 localstorage 의 이용에 의한 TAB process간의 session 정보 유지 등을 고려해야 할 듯하다. localstorage는 SessionStorage와 달리 Persist storage라 TAb processes간의 지속적으로 유지되는 공간이기 때문에 Processes간 Session 정보 유지에 이용이 가능할 수도 있겠다.
최근에 기본 인증 (Basic Authentication)을 사용하는 Web Site에서 ActiveX Control에 의한 Session 유지 방법 중 WinInet의 XMLHTTPRequest에서 (또는 InternetSetOption등을 통한) 인증 정보 설정을 통한 인증 정보의 유지 역시 TAB Processes의 구조에서 유용하기 않음이 확인되기도 하였다. (link: http://www.microsoft.com/communities/newsgroups/list/en-us/default.aspx?dg=microsoft.public.internetexplorer.beta&mid=fc57f64e-969d-422c-93ea-e23581da8891 )하지만, 해당 Issue에 대해서 Windows 7에서는 가능하도록 Design 고려가 이뤄질 듯 하다.


