[PHPSCHOOL 펌] 자동로그아웃 관련 사전 경고 보여주며 로그아웃 처리하기





[스크립트] 자동로그아웃 관련 사전 경고 보여주며 로그아웃 처리하기















글쓴이   LinuxZZang 날 짜 09-03-19 13:48 조 회 115






안녕하세요.

대부분의 웹사이트 로그인 인증은 세션이나 쿠키를 사용하고 있습니다만..
특별하게 설정하지 않는 한 30분~120분 사이에 세션이나 쿠키가 소멸 됩니다.

하지만 클라이언트가 특정 입력창을 띄워놓고 장시간 자리를 비우거나
비활성화 시켰을 경우에는 세션이나 쿠키가 삭제되어도
http프로토콜 속성상 재연결을 하기 전에는
로그아웃 여부를 알기가 어렵습니다.
 
저 역시 예전에 인터넷통신교육을 받을때
4시간 동안 교육레포트를 작성하여 입력하고 “저장”을 누르는 순간에
로그아웃 처리가 되어 교육레포트를 모두 날린적이 있습니다.

그래서 업체에 강하게 항의했더니 세션유지시간은 24시간으로 만들어 주던데..
이건 정답은 아닌거 같습니다.

그래서 아래의 소스처럼 사용자가 해당 페이지에서
아무런 작업(마우스, 키보드이벤트)도 하지 않을경우
사전경고창을 보여준후 대기시간이 지나면 자동으로 로그아웃 시키도록 만들었습니다.

물론 그 안에 어떠한 이벤트라도 발생시키면 대기시간을 다시 초기화 시키도록 하였으며,
비활성화시켰을 때도 작동이 가능하며 익스 7 에서만 테스트 했습니다.

그리고 여기 저기서 소스를 가져다 조합한거니 필요하신분은
부담없이 사용바랍니다.

감사합니다. 꾸벅.

 ——————————————————————————————-
 <html> <head>
<script>
Lpad=function(str, len)
 {
    str = str + “”;
      while(str.length < len)
    {
      str = “0”+str;
    }
     return str;
 }

/// 사용자로부터 마우스 또는 키보드 이벤트가 없을경우의
    자동로그아웃까지의 대기시간, 분단위
 var iMinute = 1;
 
 //자동로그아웃 처리 몇초전에 경고를 보여줄지 설정하는 부분, 초단위
 var noticeSecond = 55;

 var iSecond = iMinute * 60 ;
 var timerchecker = null;
 
 initTimer=function()
 {
    /// //사용자부터 마우스 또는 키보드 이벤트가 발생했을경우
          자동로그아웃까지의 대기시간을 다시 초기화
    if(window.event)
    {
    iSecond = iMinute * 60 ;;
     clearTimeout(timerchecker);
      coverFilmMain.style.visibility=’hidden’; //// 입력방지 레이어 해제
    timer.style.visibility=’hidden’;  /// 자동로그아웃 경고레이어 해제
    }
    rMinute = parseInt(iSecond / 60);
    rSecond = iSecond % 60;
    if(iSecond > 0)
    {
    /////지정한 시간동안 마우스, 키보드 이벤트가 발생되지 않았을 경우
        if(iSecond < noticeSecond)
          {
            coverFilmMain.style.visibility=’visible’; /// 입력방지 레이어 활성
            timer.style.visibility=’visible’;  /// 자동로그아웃 경고레이어 활성
                        }
            ///자동로그아웃 경고레이어에 경고문+남은 시간 보여주는 부분
      timer.innerHTML = 
                    “<font family=tahoma style=’font-size:70;’>AUTO LOG OUT</font>
                    </h1> <font color=red>” + Lpad(rMinute, 2)+”:”+Lpad(rSecond, 2) ;
        iSecond–;
      timerchecker = setTimeout(“initTimer()”, 1000); // 1초 간격으로 체크
    }
    else
    {
          clearTimeout(timerchecker);
        alert(“장시간 미사용으로 자동 로그아웃 처리되었습니다.”);
        ////location.href = “./logOut.php”; // 로그아웃 처리 페이지
    }
 }
 onload = initTimer;///현재 페이지 대기시간
 document.onclick = initTimer; /// 현재 페이지의 사용자 마우스 클릭이벤트 캡춰
document.onkeypress = initTimer;/// 현재 페이지의 키보트 입력이벤트 캡춰
</script>
 </head>
 <body topmargin=0 leftmargin=0>
 <!– 비활성화 시키는 레이어–>
 <div id=’coverFilmMain’ style=’z-index: 99997; position:absolute; visibility:hidden; width:100%; height:100%; background-color:#000000; filter:Alpha(opacity=20); opacity:0.6; -moz-opacity:0.6; text-align:center; font-size:12pt;color:black;’></div>
  <!– 자동로그아웃시까지 남은 시간을 보여주는 레이어–>
  <div id=”timer” style=”position:absolute; width:100%; height:40%;margin-top:20%; visibility:hidden; border:0;  color:black; font-family:tahoma; font-size:150;font-weight:bold;text-align:center”></div>

입력 <input type = text size=10><br>
입력 <input type = radio checked><input type = radio><br>
입력 <input type = checkbox>
입력 <select><option>123</option><option>1234</option></select>
입력 <textarea></textarea>
<pre>
사용자로부터 지정한 대기시간동안 아무런 마우스, 키보드 이벤트가 발생하지 않을 경우

지정한 시간부터 자동로그 아웃 경고를 보여주며,

대기시간이 지나면 자동으로 로그아웃 처리합니다.

하지만 사용자로부터 마우스, 키보드 이벤트가 발생할 경우 대기시간을 다시 초기화 시킵니다.

* 익스7 기준으로 테스트 되었습니다.
* 비활성화시켜도 작동됩니다.

감사합니다. 꾸벅
</body></html>

PHP Framework CODEIGNITER의 장점과 사용하면서 불편했던 점

먼저 좋은 점은 가볍다 입니다. 확장도 용이하구요.
사용자들이 올려놓은 wiki의 파일이나 플러그인이 이용할만한게 많습니다.
다른 프레임워크도 그렇지만 지원되는 함수(유저가이드 참고)가 정말 필요한 것들을 집약해놓았습니다.
jquery를 이그나이터의 함수처럼 사용하는 부분도 있고.
폼체크, 페이징, 트랙백, xml, 세션 암호화 등등.. 유저 가이드 대로만 하면 금방 구현. ^^
helper도 마찬가지구요.
모델의 경우 다른 컨트롤을 위해 만든 모델도 로딩시켜서 그냥 쓸 수 있다는거..
common 모델을 만들고 기능별로 따로 만들어서 불러서 쓰는 것이 좋겠죠.
모델에서 데이터 처리후 배열로 뷰파일에 전달, foreach(){ .. }로 처리하기만 하면 되는 뷰.
MVC패턴의 장점이야 두말할 나위가 없구요.

단점으로는 모든 프레임워크가 그렇듯 사용법을 따로 배워야 하죠.
$_POST[‘var’] 로 처리하던 것만 하더라도 $this->input->post(‘var’)로 바꿔서 사용해야 합니다.
$_SERVER 도 마찬가지..

http://www.h.com/index.php/together/mview/index/ 의 주소체계를 사용하다보면 검색후 2페이지로 이동할때 검색어를
http://www.h.com/index.php/together/mview/index/10/검색어 (검색어 부분은 실제로는 urlencode해서 넘깁니다.)의 형태로 넘기게 되는데
간혹 중간에 프로그램 수정에 의해 인자가 추가되는 경우가 있으면 좀 난감해집니다.
그래서 코드이그나이터 포럼에 검색을 해보니 쿠키로 처리하는 경우도 있었고 config.php 파일에서 $config[‘enable_query_strings’] 를 TRUE로 셋팅하여
주소체계를 혼용하여 사용하면 해결이 가능하긴 하지만 그렇게 되면 또 한가지 문제가 생깁니다.
$config[‘enable_query_strings’] = TRUE; –> http://www.h.com/index.php?d=together&c=mview&m=index&page=10&q=검색어 형태의 주소로 사용할 수 있습니다.
이렇게 되면 해결이 되는데 문제는 코드이그나이터의 pagenation 라이브러리 사용에서 문제가 생깁니다.
기존형식으로 사용할때는 잘 작동하던 페이징이 $config[‘enable_query_strings’] = TRUE 가 되면 페이징의 주소가 기존과 다른 형태로 바뀌면서 오작동을 합니다.
그래서 pagenation config 선언할때 한줄을 더 추가해줘야 합니다.
$config[‘page_query_string’] = FALSE; 이 라인이 추가 되어야 문제없이 사용이 됩니다.
설명이 좀 어려운데 실제로 코딩해보시면 이해가 금방 됩니다. ^^;
전 두가지 방법을 다 적용했습니다. 쿠키로 구워서 체크후 일정시간후 날리는 방법과 주소형태를 바꾸는 방법.

그리고 1.7.1 버전에서는 고쳐졌는지 확인을 안해봤는데 제가 사용했던 1.6.3 버전에서는 로그인후 창을 닫으면 세션이 그대로 살아있습니다. 수정하려면 아래 부분 패치

config.php 파일의 $config[‘sess_expiration’] = -1 로 수정후

libraries 디렉토리의 Session.php 89 라인
if ($this->sess_expiration == 0)
{
$this->sess_expiration = (60*60*24*365*2);
}

if ($this->sess_expiration == 0)
{
                $this->sess_expiration = (60*60*24*365*2);
}
else
{
$this->sess_expiration = (60*60*24);
}
로 수정

659라인
setcookie(
$this->sess_cookie_name,
$cookie_data,
– //$this->sess_expiration + time(),
+ ($this->CI->config->item(‘sess_expiration’) == -1) ? 0 : ($this->sess_expiration + time()),
$this->cookie_path,
$this->cookie_domain,
0
);


config.php 파일의 $config[‘permitted_uri_chars’] = ‘a-z 0-9~%.:_=\-‘; 부분도 문제가 됩니다.
주소로 사용할 수 있는 문자를 정규표현식으로 표현한 것이데 간혹 한글을 주소에 사용하기위해 urlencode 했을때 충돌이 납니다.
경우의 수를 다 찾아서 넣어주면 좋겠지만 전 현재 $config[‘permitted_uri_chars’] = ”; 이렇게 사용중입니다.

일단 생각 나는 부분은 여기까지인데 추후에 더 보강하겠습니다. ^^

PHP FREAMEWORK CODEIGNITER 기본 형태

사용자 삽입 이미지application 디렉토리 하단의 controllers 디렉토리가 컨트롤의 역할을, views 디렉토리는 뷰의 역할을, models 디렉토리는 모델의 역할을 한다.

서브 디렉토리 형태로 사용할 수 있으며, 기능별 혹은 프로그램 그룹별로 디렉토리를 나누어 이용할 수 있다.
(예 http://localhost/index.php/blog/ -> 블로그, http://localhost/index.php/blog/index 도 동일한 결과이다
기본이 되는 index 함수는 생략가능. 그러나 index 뒤에 인자를 준다면 써줘야 한다)

컨트롤의 경우에는 디렉토리를 나누지 않고 controllers 디렉토리에 위치시키는 것도 괜찮다.
작업해보니 각 프로그램 그룹별(블로그, 포토갤러리 등) 컨트롤 프로그램은 1개, 혹은 2개 정도였고
많더라도 대여섯개 정도인데 굳이 디렉토리를 나눌 필요까지는 없을 듯 하다. (나눠도 상관은 없다. ^^;)

모델과 뷰의 경우에는 꼭 컨트롤과 짝이 되는 모델과 뷰를 사용하지 않아도 된다.
위 그림의 예에서 보면 컨트롤에서

   $this->load->model(‘blog_model‘); -> /application/models/blog_model.php
그러나 필요한 모델, 혹은 공통 모델을 따로 정의해놨다면 그 모델을 로딩하고 펑션을 가져다 쓰면 된다.
자주 쓰는 공통 기능은 공통 모델파일로 따로 만들어놓는 것이 편하다.

컨트롤에서 모델에서 데이터를 가져오고(혹은 가공하고) 뷰로 넘길때는 배열형태로 넘긴다.

 

$data[‘page_title‘] = ‘Your title‘;


$this->load->model(‘blog_model‘); // 모델을 선언


$this->load->view(‘common/top’); // 뷰 파일 선언. 데이터 넘길 필요가 없는 경우



$data[‘query’] = $this->blog_model->get_last_ten_entries(); // 모델에서 데이터를 가져옴(배열)


$this->load->view(‘blogview‘, $data); // blogview.php 뷰파일을 로딩한다.
                                                // $data변수로 배열을 넘김
                                                // 뷰파일에서는 첫줄 $data[‘page_title‘]의 경우에는
                                                // $page_title 로 사용한다.
       
                                                // $data[‘query’]는 배열로 넘긴것이라 foreach를 이용


통 프레임의 경우 상하단 include 시키는 파일은 컨트롤에서 위의 예문처럼 선언하거나
뷰파일 상단에 <? echo $this->load->view(‘top’); ?> 이렇게 선언해도 된다.

두바이, 사막의 오아시스인가? 신기루인가?












두바이, 사막의 오아시스인가? 신기루인가?
































7성급 호텔 버즈 알 아랍, 야자수 모양의 인공섬 팜 주메이라, 사막 한가운데에 있는 스키장.
두바이를 생각하면 떠오르는 화려한 이미지들입니다. 두바이는 몇 년 전까지만해도 놀라운 성장을 거듭했습니다. 많은 외국인 투자자들이 두바이로 몰려갔고, 우리나라에서는 두바이를 배우자는 열풍이 일었습니다. 그러나 전세계 경제 위기에 두바이는 흔들리고 있습니다. 지난 2월에는 아랍에미리트 중앙정부의 구제금융을 받았지만 아직 위기는 끝나지 않았습니다. 두바이에 진출한 우리 건설업체들은 공사대금을 받지 못할까봐 불안해하고 있습니다. 두바이는 어쩌다가 이렇게 되었을까요?
두바이는 아랍에미리트의 7개의 토후국 중 하나입니다. 두바이는 석유가 거의 나오지 않는데다 앞으로 석유가 완전히 없어졌을 때를 대비해서 금융과 관광을 키웠습니다. 아시아와 중동을 연결하고, 중동 전체 지역과 유럽, 북아프리카를 잇는 지역으로 두바이는 국제공항, 항구 등을 만들어 물류와 교역 중심지로 키워나갔습니다. 특히 외국인 투자자들을 많이 모으기 위해 노력했습니다. 자유무역지대를 만들어 소득과 수입에 매기는 세금을 모두 없애고, 외국인의 기업 소유를 인정해 주었습니다. (자유무역지대 외의 지역에 기업을 만들 경우 외국인은 49% 밖에 소유할 수 없습니다.) 물론 모든 경우에 세금이 없는 것은 아니고 석유 관련된 산업이나 은행, 부동산 임대업 같은 경우에는 법인세가 있습니다. 또한 기업 입장에서는 인도, 파키스탄, 필리핀 등에서 온 싼 임금의 노동자가 많고, 노조를 만들어서도 안 되고, 해고도 쉬운 점은 아주 매력적으로 다가왔습니다.
그와 더불어 두바이에 대한 좋은 이미지를 심어주기 위해서도 많은 노력을 기울였습니다. 건물을 세웠다하면 세계 최고, 세계 최대였고, 바다에 인공섬을 만들어 호화로운 빌라를 만들고, 세계적인 테니스 대회, 골프 대회들을 열어 세계인의 이목을 집중시켰습니다.






언제나 호화로운 불빛이 켜지고, 새로운 건물과 전세계에서 몰려온 사람들로 북적일 것 같은 두바이에도 위기가 찾아왔습니다. 지난해 미국의 금융위기는 전세계에 영향을 미치지 않은 곳이 없었습니다. 두바이도 마찬가지였습니다. 두바이에서 이루어지고 있는 거대한 토목공사와 건설은 비용이 많이 들어갑니다. 두바이는 석유가 나지 않기 때문에 돈이 부족했고 이 돈은 모두 해외에서 빌렸습니다. 미국 금융위기가 닥치자 투자자들은 해외에서 돈을 빼가기 시작했고, 두바이는 어려움을 겪게 되었습니다. 두바이에서 계획했던 또 다른 인공섬 ‘팜 데이라’, 사막에 운하를 만들려고 했던 ‘아라비안 운하’, 1천m의 세계 최고 빌딩 ‘하버 앤 타워’와 같은 사업들은 규모가 축소되고, 일정이 뒤로 미뤄졌습니다.
투자자금과 함께 빠져나간 것은 사람들입니다. 두바이에서 일하고 있는 노동자의 70%는 외국인인데 이들은 일자리를 잃고 자기 나라로 돌아가고 있습니다. 두바이 국제공항에는 버려진 자동차가 3000대를 넘었다는 기사도 나올 지경이 됐습니다. 사람이 빠져나가면서 그 사람들이 살던 집값도 떨어졌습니다. 집값이 떨어지면서 집을 담보로 대출해주던 두바이 최대 담보대출사인 암락(Amlak)은 가계대출을 중단했습니다. 이런 모든 상황을 반영하듯이 두바이 주가는 작년 한때 6,000을 넘어셨는데 비해 올해는 1,500 정도로 떨어졌습니다.

두바이가 사막의 오아시스로 남을지 아니면 신기루에 불과할 지는 알 수 없습니다. 그렇지만 지금까지의 과정을 볼 때 경제성장의 기반이 되는 사회간접자본에 투자하는 것이 아니라 겉치례로 이루어지는 건설과 토목으로 이루어낸 경제 성장이 허망하다는 것을 깨달을 수 있습니다. 그리고 자기의 돈이 아니라 남의 돈을 빌려서 무리하게 추진된 사업의 위험성도 경고해주고 있습니다. 우리 앞에 닥친 경제 위기를 극복하기 위해서도 두바이의 사례를 통해 우리나라를 되돌아보는 계기가 되었으면 합니다.
     









– 톨스토이, 레닌, 화폐는 루블화, 수도는 모스크바, 브릭스는 브라질, OOO, 인도, 중국
     최초의 숫자 1






  1은 우리가 가장 먼저 배우는 숫자일 것입니다.
  1은 제일 처음 나오는 수이기도 하고 제일 많이 쓰이는 수입니다.
  1은 최고, 승자, 리더와 같은 뜻으로 쓰이지요……..