Post

스프링 세션 적용하기 with 필터 !

🔍 Session 정보 이용하기

✏️ 1. 컨트롤러에서 HttpSession 클래스 이용하기

HttpSession 클래스를 파라미터로 받으면 session 정보를 사용할 수 있다.

1번.png

✏️ 2. 필터 또는 인터셉터 이용하기

필자는 세션 정보를 거의 모든 요청 API에서 확인해야 한다. 따라서 Controller에서 session 정보를 불러오는 중복을 해결하기 위해 필터를 이용하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component  
class SessionFilter(  
     
): OncePerRequestFilter() {  
  
    val log = logger()  
  
    override fun doFilterInternal(  
	    request: HttpServletRequest,  
	    response: HttpServletResponse,  
	    filterChain: FilterChain  
	) {  
  
	    val session = getSessionFromCookie(request)          --- 1
	    if (session == null) {  
	        val sessionId = request.getSession(true).id      --- 2
	    }  
  
	    filterChain.doFilter(request, response)  
	}
}
  1. 쿠키에 세션에 대한 정보가 있는지 확인한다.
  2. 세션이 없다면 새로운 세션을 생성한다. (세션이 생성될 때 저장소에 저장된다)
    1. 이때, 스프링 세션을 사용하면 스프링 세션으로 저장한 저장소에 자동으로 저장된다.
    2. redisSessionRepository.save(session)와 같은 작업을 할 필요가 없다.


MyRedisSessionRepository는 다음처럼 되어 있다.

1
2
3
4
5
6
7
8
9
10
class MyRedisSessionRepository(
	...
) {
	private val SESSION_PREFIX = "kmall:sessions:"  
  
	fun setSession(sessionId: String) {  
	    stringRedisTemplate.opsForSet().add(SESSION_PREFIX, sessionId)  
	    stringRedisTemplate.expire(SESSION_PREFIX, 3, TimeUnit.DAYS)  
	}
}
  • SESSION_PREFIX는 세션을 저장할 때 사용할 prefix이다.
  • setSession 메서드는 세션을 저장소에 저장한다.

🔍 결론

  • HttpSession은 메서드의 파라미터로 받아서 간단하게 이용할 수 있었다.
  • Spring Session을 사용하면 세션을 생성할 때 자동으로 저장소에 저장한다.
  • 필터를 사용하여 컨트롤러에 생기는 중복 코드를 제 거할 수 있다.

🗝️ 트러블 슈팅

Key가 두 개 생기는 이유

쿠키와 Base64 인코딩

This post is licensed under CC BY 4.0 by the author.

© bear-su. Some rights reserved.