Spring Security 로그인을 처리하면, 사용자의 인증 정보를 관리하기 위해 SecurityContext 객체를 세션 자바 객체형태로 저장한다.
Spring Session과 Redis를 사용하여 세션을 관리하고 있다면, SecurityContext 객체는 Redis에 저장된다.
객체를 직렬화(객체->바이트 배열) 하여 저장하면 어떻게 될까?
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
@EnableRedisHttpSession
public class RedisConfig {
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return RedisSerializer.json();
}
}
RedisSerializer.json을 사용하여 레디스에 객체->바이트로 변환되어 잘 저장되는 것을 확인할 수 있다.
하지만, 저장된 데이터를 다시 사용하려면 역직렬화(바이트 배열을 객체로 변화) 과정이 필요한데
SecurityContextImpl 클래스의 객체를 올바르게 생성할 수 있는 생성자가 없기 때문에 다시 객체로 돌아갈 수 없다.
결국, 세션에서 이 객체를 읽어올 수 없게 되며 애플리케이션이 정상적으로 동작하지 않고 다음과 같은 에러를 발생시킨다.
org.springframework.data.redis.serializer.SerializationException: Could not read JSON:Cannot construct instance of `org.springframework.security.authentication
'Back-end' 카테고리의 다른 글
JWT secret key 생성 방법 (0) | 2024.07.27 |
---|