Java - Spring &&n SpringBoot

Spring Session 다루기 : 세션 정보, 세션 타임 아웃 설정

TerianP 2022. 8. 11.
728x90

Session 에 담긴 정보 가져오기

  • Session 에는 해당 세션의 id, 세션이 살아있을 수 있는 최대 시간, 세션 생성 시간, 마지막 세션 접근 시간 이 있다.
  • 각각 아래와 같이 get 메서드로 해당 내용을 가져올 수 있다.

세션에 담긴 정보

@GetMapping("/session-info")
public String sessionInfo(HttpServletRequest req) {
    HttpSession session = req.getSession(false);
    if (session == null) {
        return "세션이 없습니다";
    }

log.info("sessionId = {}", session.getId());
log.info("getMaxInactiveInterval={}", session.getMaxInactiveInterval());
log.info("creationTime={}", new Date(session.getCreationTime()));
log.info("lastAccessTime={}", new Date(session.getLastAccessedTime()));

    return "세션출력";

}

 

Session 타임 아웃 설정

세션의 타임아웃은 왜 필요할까?

  • Http 는 기본적으로 비 연결성(ConnectionLess)이라는 특징을 갖는다(서버와 실시간 연결의 의미인듯?) 이 때문에 서버 입장에서는 해당 사용자가 웹 브라우저를 종료한 것인지 아닌지, 세션 정보를 삭제해야하는지 아닌지 알 수 없다. 동시에!! 세션은 서버의 메모리에 저장된다.
  • 이 때문에 세션에 대해 타임 아웃 설정이 안되어있어서 세션의 종료(삭제없이) 세션을 서버에서 무한정 보관하는 경우….당연히 어느 순간 메모리 초과가 발생할테고 펑! 터져버린다 —> 야근은 덤
  • 또한 해당 유저의 세션을 악의적인 해커가 탈취한 경우 서버쪽에서 세션이 살아있을 때 해당 세션을 통해 악의적으로 접근, 공격이 가능하다.

세션 종료 시점은?

  • 그러면 세션 종료 시점을 어떻게 잡아야할까? 아주 단순하게는 세션 생성 시점+30분 혹은 1시간으로 잡으면 된다. 그런데 이렇게하면 중간에 로그아웃 없이 30분동안 열심히 해당 웹 사이트를, 서버를 사용하는 사용자도 30분이 지나면 무조건 로그인을 해야한다는 점이다 ⇒ 열심히 30분동안 게임하다가 강제 로그아웃되어서 로그인의 과정을 거쳐야한다
  • 이 때문에 가장 좋은 방법은 가장 최근에 해당 세션에 접근한 시간을 기준으로 30분을 유지(추가) 해주는 것이다. 이러면 사용하는 시간동안 계속 세션이 갱신될 것이고, 이로인해 30분마다 로그인해야하는 번거로움이 사라지게 된다 ⇒ HTTP Session 의 기본 생명 주기

세션 타임 아웃 설정 - SpringBoot 기준 -

  • 글로벌 설정의 경우 의 경우 applictionProperties 를 사용한다.
    • 모든 세션에 대한 설정 : n초를 적는다 =⇒ 30분 == 1800 초
#Sessions ==> n초를 적으면 된다. 30분 == 1800초
server.servlet.session.timeout=1800
  • 특정 세션에 대한 설정
    • 세션 생성시 코드로 설정 ⇒ setter 사용
// 세션 생명 시간 설정
session.setMaxInactiveInterval(3600);

댓글