개인 프로젝트/프로젝트

PhotoGallery_국비실습_기능정리_세션만료

Leo.K 2022. 6. 11. 18:51

오늘은 로그인한 사용자에게 부여한 세션값을 사용해서 모든 페이지에서 해당 사용자의 정보를 이용할 수 있도록 세션 트래킹 기법을 활용하는데, 이 세션에는 유효시간이라는 것이 존재한다. 이 세션이 만료된 경우 어떻게 처리해야 하는지에 대해 정리해보고자 한다. 

세션의 기본적인 유효시간은 30분이라고 하는데,  이 30분이 접속시간이 아니라 브라우저에 접속시 아무런 행동도 하지 않고 30분 동안 있을경우 세션의 유효시간이 끝난다고 한다. 처음 접했을 때는 시간이 꽤나 여유로운데? 굳이 세션 만료까지 처리해야 하나?라는 의문은 있었지만, 이 의문은 얼마가지 않아 해결되었다. 

필자가 따로 진행하던 연애 대작전 프로젝트에서 기능을 추가하던 중 중간에 막혀서 구글링과 다른 공부를 하다가 다시 실행해보았는데, 예상치 못한 에러를 만나게 되었다.

기능을 추가중이던 작업이 로그인한 사용자만 이용할 수 있는 서비스였다.  로그인한 사용자 정보를 세션스코프에 저장해서 다른 모든 페이지에서 사용자의 정보를 유지 및 공유해서 사용했다.(세션 트래킹. 기본 유효시간 30분)

그런데 잠깐 다른일을 하고 와서 다시 실행해보니 세션이 만료되어 세션값에는 사용자 정보가 없어졌고, 없는 값에 접근해서 읽어들이려 했으니 오류가 나타난 것이다.

이런 경험을 해보니 세션이 만료되었을 때의 처리를 해주어야 한다고 생각이 들어서 정리해보고자 한다. 

이번에는 학원 수업에서 배운 내용으로 하나의 case뿐이지만, 실제 프로젝트를 구현할 때는 로그인 정보가 필요한 페이지에 대해서는 모두 이와 같은 세션 만료 처리를 일일히 해주어야 한다. 

 

세션 만료 처리 대상을 추려보자면 다음과 같다. 

  1. 로그인 후에 할 수 있는 기능 중에서 jsp파일로부터 파라미터를 받는 경우 or DB에 접근해야 하는 경우이다. 
  2. 위의 경우에 해당하는 서블릿의 가장 처음부분에서 로그인 정보가 있는지, 즉 아직 세션이 유효한지를 확인해야 한다.
  3. 사용자의 요청 정보를 담고 있는 request객체에 로그인했을 때 저장한 사용자의 세션 정보(user)가 있다.
  4. 만약에 세션이 유효해서 조건을 통과한다면 그냥 그 밑의 코드를 이어서 진행하면 되는 것이고, 세션이 만료되어서 조건을 통과하지 못한다면 login_form으로 redirect를 하는데 오류정보를 쿼리형식으로 담아서 전송해주어야 한다.
  5. 아래의 파일은 PhotoInsertAction.java로 위의 필자가 말한대로, 파라미터도 수신하고, DB에도 접근해야 하는 경우다  
1
2
3
4
5
6
7
//로그인 정보 읽어오기
MemberVo user = (MemberVo)request.getSession().getAttribute("user");
        
if(user == null) { //세션이 만료된 경우
    response.sendRedirect("../member/login_form.do?reason=session_timeout");
    return;
}
cs

 

위와 같이 코드를 작성해주면, 끝이다...가 절대 아니지! 

그냥 리다이렉트만 했으면 모를까, 우리는 방금 쿼리로 파라미터를 전송했다. 그렇다면 반드시 파라미터를 수신하는 코드를 작성해야 하지 않겠는가? 그렇다면 위의 파라미터를 수신하는 파일로 이동해서 아래의 코드를 추가해주자. 수정하는 파일은 member폴더에 있는 member_login_form.jsp파일이다. 코드에 대한 설명은 여기에 저장되어 있으니 확인하길 바란다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script type="text/javascript">
$(document).ready(function(){
    //0.1초 후에 showMessage함수 호출
    setTimeout(showMessage, 100);
});
function showMessage(){
        
    ///member/login_form.do?reason=session_timeout
    if("${param.reason eq 'session_timeout'}" == "true"){
        alert('로그아웃 되었습니다.');
        return;
    }
}
</script>
cs