Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 그리디
- 백준
- 자바
- JPQL
- 스프링
- QueryDSL
- Exception
- spring
- JDBC
- Spring Boot
- springdatajpa
- AOP
- http
- 인프런
- Thymeleaf
- 알고리즘
- Greedy
- db
- SpringBoot
- pointcut
- kotlin
- 스프링 핵심 원리
- 김영한
- transaction
- Android
- java
- 스프링 핵심 기능
- jpa
- Proxy
- Servlet
Archives
- Today
- Total
개발자되기 프로젝트
[로그인] Session 정보와 TimeOut 설정 본문
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
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
[로그인] Servlet Filter - 요청 로그 (0) | 2021.09.26 |
---|---|
[로그인] Servlet Filter (0) | 2021.09.26 |
[로그인] 로그인 처리 - Servlet HttpSession 2 (0) | 2021.09.26 |
[로그인] 로그인 처리 - Servlet HTTP 세션 (0) | 2021.09.26 |
[로그인] 로그인 처리 - 세션 적용 (0) | 2021.09.26 |
Comments