Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[로그인] Session 정보와 TimeOut 설정 본문

인프런/[인프런] 스프링 MVC 2

[로그인] Session 정보와 TimeOut 설정

Seung__ 2021. 9. 26. 14:40

1. Session 정보를 출력해보자.


  • session에서 time을 가져오면 타입이 long이다. new Date()에 넣어서 날짜 형식으로 바꿈.
@Slf4j
@RestController
public class SessionInfoController {

    @GetMapping("/session-info")
    public String sessionInfo(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session == null){
            return "세션이 없음";
        }

        //세션 데이터 출력
        session.getAttributeNames().asIterator()
                .forEachRemaining(name -> log.info("session name={}, value={}", name, session.getAttribute(name)));


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

        return "세션 출력";
    }
}
session name=loginMember, value=Member(id=1, loginId=test, name=테스터, password=test!)
sessionId=0A67277BD9B60603EE2201F6D6634C62
session.getMaxInactiveInterval() = 1800
session.getCreationTime() = Sun Sep 26 14:18:42 KST 2021 
session.getLastAccessedTime()= Sun Sep 26 14:18:42 KST 2021
session.isNew() = false

 

  • sessionId : 세션Id, JSESSIONID 의 값이다. 예) 34B14F008AA3527C9F8ED620EFD7A4E1
  • maxInactiveInterval : 세션의 유효 시간, 예) 1800초, (30분)
  • creationTime : 세션 생성일시
  • lastAccessedTime : 세션과 연결된 사용자가 최근에 서버에 접근한 시간, 
    • 클라이언트에서 서버로 sessionId ( JSESSIONID )를 요청한 경우에 갱신된다.
  • isNew : 새로 생성된 세션인지, 아니면 이미 과거에 만들어졌고, 클라이언트에서 서버로
  • sessionId ( JSESSIONID )를 요청해서 조회된 세션인지 여부

 

 

2. 세션 타임아웃 설정


  • 세션은 사용자가 로그아웃을 직접 호출해서 session.invalidate() 가 호출 되는 경우에 삭제된다.
  • 대부분 로그아웃을 선택하지 않고, 그냥 웹 브라우저를 종료
  • 문제는 HTTP가 비 연결성(ConnectionLess)이므로 서버 입장에서는 
  • 해당 사용자가 웹 브라우저를 종료한 것인지 아닌지를  인식할 수 없음.
  • 따라서 서버에서 세션 데이터를 언제 삭제해야 하는지 판단하기가 어려움.
  • 세션은 메모리를 사용하는데, 계속 세션이 메모리에 누적될 수 있다.

 

  • 그래서 남아있는 세션을 계~속 보관하면 문제가 발생할 수 있음.
    • 세션과 관련된 쿠키( JSESSIONID )를 탈취 당했을 경우 
    • 오랜 시간이 지나도 해당 쿠키로 악의적인 요청 가능.
    • 또한 세션은 기본적으로 메모리에 생성된다. 
    • 메모리의 크기가 무한하지 않기 때문에 꼭 필요한 경우만 생성해서 사용해야함.

 

 

3. 세션의 종료 시점.


  • 세션의 종료 시점을 어떻게 정함??
  • 사용자가 서버에 최근에 요청한 시간을 기준으로 30분 유지
  • 이렇게 하면 사용자가 서비스를 사용하고 있는 경우, 
  • 세션의 생존 시간이 30분으로 계속 변경됨.
  • HttpSession 은 이 방식을 사용

 

4. 세션 타임아웃 설정


  • SpringBoot로 global 설정
    • application.properties
    • server.servlet.session.timeout=60
       
    •  기본은 1800(30분)
    • (글로벌 설정은 분 단위로 설정해야 한다. 60(1분), 120(2분), ...)
  • Session 단위로 시간 설정 가능.
ession.setMaxInactiveInterval(1800);

 

 

5. 타임아웃 확인해보자.


session.getMaxInactiveInterval() = 60
  • 세션의 타임아웃 시간은 해당 세션과 관련된 JSESSIONID 를 전달하는 HTTP 요청이 있으면 
  • 현재 시간으로 다시 초기화 됨.
    • 최초 로그인 -> creationTime 
    • 이후 클라이언트가 요청에 쿠키(jsessionid)담아서 보냄. -> 갱신
  • 이렇게 초기화 되면 세션 타임아웃으로 설정한 시간동안 세션을 추가로 사용할 수 있다.
  • session.getLastAccessedTime() : 최근 세션 접근 시간
  • LastAccessedTime 이후로 timeout 시간이 지나면, WAS가 내부에서 해당 세션을 제거

 

6. 정리


  • 실무에서 주의할 점은 세션에는 최소한의 데이터만 보관해야함.
  • 별도 객체를 만들어서 필요한 데이터만 보관
  • 보관한 데이터 용량 * 사용자 수로 세션의 메모리 사용량이 급격하게 늘어나서 장애로 이어질 수 있다. 
  • 세션의 시간을 너무 길게 가져가면 메모리 사용이 계속 누적 될 수 있음
  • 적당한 시간을 선택하는 것이 필요하다. 기본이 30 분임.

 

7. GitHub : 210926 timeout


 

GitHub - bsh6463/login

Contribute to bsh6463/login development by creating an account on GitHub.

github.com

 

Comments