- nginx
- Git
- sql
- spring boot
- ORM
- AWS
- Docker
- spring mvc
- PYTHON
- select
- Django
- 데이터베이스
- 프로그래머스
- java
- join
- spring
- jpa
- springboot
- session
- SSL
- 스프링
- 자바
- spring security 6
- DI
- 스프링부트
- 1차원 배열
- mysql
- @transactional
- string
- 문자열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
개발하는 자몽
[Spring] 세션 정보와 타임아웃 본문
섹션 6. 로그인 처리1 - 쿠키, 세션
이전 포스트
2023.03.16 - [Spring] - [Spring] 쿠키의 보안 문제와 세션
세션 정보
가져온 세션의 정보를 출력해 보자.
@GetMapping("/session-info")
public String sessionInfo(HttpServletRequest request) {
HttpSession session = request.getSession(false);
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("getMaxInactiveInterval={}", session.getMaxInactiveInterval());
log.info("creationTime={}", new Date(session.getCreationTime())); //long -> Date
log.info("lastAccessedTime={}", new Date(session.getLastAccessedTime()));
log.info("isNew={}", session.isNew());
return "세션 출력";
}
- sessionId : 세션 Id, JESSIONID의 값이다.
- maxInactiveInterval : 세션의 유효 시간 (기본 1800초)
- creationTime : 세션 생성 일시
- lastAccessedTime : 세션과 연결된 사용자가 최근에 서버에 접근한 시간, 클라이언트에서 서버로 sessionId(JESSIONID)를 요청한 경우에 갱신된다.
- isNew : 새로 생성된 세션인지 또는 이미 과거에 만들어졌고, 클라이언트에서 서버로 sessionid(JESSIONID)를 요청해서 조회된 세션인지 여부를 나타낸다.
세션 종료 시점
세션은 사용자가 로그아웃을 해서 session.invalidate()가 호출되는 경우에 삭제된다. 하지만 대부분의 사용자는 로그아웃을 클릭하지 않고, 웹 브라우저를 종료한다. HTTP는 비연결성(Connectionless)이므로 서버 입장에서는 해당 사용자가 웹 브라우저를 종료한 것인지 아닌지 알 수 없다. 따라서 서버에서 세션 데이터를 언제 삭제해야 하는지 판단하기 어렵다. 남아있는 세션을 무한정 보관하면 아래와 같은 문제가 발생할 수 있다.
- 세션과 관련된 쿠키(JESSIONID)를 탈취당했을 경우 오랜 시간이 지나도 해당 쿠키로 악의적인 요청을 할 수 있다.
- 세션은 기본적으로 메모리에 생성된다. 메모리의 크기는 한정적이므로 꼭 필요한 경우에만 생성하여 사용해야 한다.
세션의 기본 유효 시간은 30분이다. 사이트를 이용하다가 30분이 지나면 세션이 삭제되기 때문에 다시 로그인을 해서 세션을 생성해야 한다. 즉, 30분마다 다시 로그인을 해야 한다.
대안은 사용자가 서버에 최근에 요청한 시간을 기준으로 30분 정도를 유지해 주는 것이다. 이렇게 하면 사용자가 서비스를 이용 시 세션의 유효 시간이 30분으로 계속 늘어나게 되어 30분마다 로그인하지 않아도 된다.
스프링의 세션 타임아웃 글로벌 설정
application.properties에 아래 코드를 추가하자. 아래처럼 작성하면 60초로 설정된다. (기본 1800초(30분))
server.servlet.session.timeout=60
아래는 특정 세션 단위로 시간을 설정하는 코드이다.
session.setMaxInactiveInterval(1800); //1800초 = 30분
세션 타임아웃 발생
세션의 타임아웃은 해당 세션과 관련된 JSESSIONID를 전달하는 HTTP 요청이 있으면 현재 시간으로 다시 초기화된다. LastAccessedTime이후로 타임아웃 시간이 지나면 WAS가 내부에서 해당 세션을 제거한다.
'Java > Spring' 카테고리의 다른 글
[AOP / Spring] 프록시 팩토리 - 포인트컷, 어드바이스, 어드바이저 (0) | 2023.03.30 |
---|---|
[Spring]동적 프록시 - JDK 동적 프록시, CGLIB (0) | 2023.03.29 |
[Spring] 쿠키의 보안 문제와 세션 (0) | 2023.03.16 |
[Spring] 로그인, 로그아웃 처리 - 쿠키, 세션 (0) | 2023.03.15 |
[JPA Error] FetchType.LAZY로 인한 오류 : Type definition error (0) | 2023.02.13 |