Table of Contents
						
						Auth Server Session 정보 Redis 에 저장
Redis 활성화
build.gradle
......
dependencies {
    // ......
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.session:spring-session-data-redis'
    // ......
}
......
application.yml
spring:
  redis:
    cluster:
      nodes: 127.0.01:6379
  session:
    store-type: redis
server:
  port: 9000
  servlet:
    session:
      timeout: 43200m      # 60m * 24h * 30d
      cookie:
        max-age: 43200m    # 60m * 24h * 30d
        name: AUTHSID
        http-only: true
        # secure: true
RedisConfig.java
@RequiredArgsConstructor
@Configuration
@EnableRedisRepositories
public class RedisConfig {
    private final RedisProperties redisProperties;
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort());
    }
    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}
Session 정보 Redis 에 저장
SessionConfig.java
@Configuration
public class SessionConfig implements BeanClassLoaderAware {
    private ClassLoader loader;
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer(objectMapper());
    }
    private ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModules(SecurityJackson2Modules.getModules(this.loader));
        return mapper;
    }
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        this.loader = classLoader;
    }
}
Entity Deserializer 생성
UserDeserializer.java
public class UserDeserializer extends JsonDeserializer<User> {
    @Override
    public User deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        ObjectCodec objectCodec = jsonParser.getCodec();
        JsonNode node = objectCodec.readTree(jsonParser);
        return User.builder()
                .userId(node.get("userId").longValue())
                .email(node.get("email").asText())
                .password(node.get("password").asText())
                .firstName(node.get("firstName").asText())
                .lastName(node.get("lastName").asText())
                .roles(node.get("roles").asText())
                .build();
    }
}
@JsonDeserialize(using = UserDeserializer.class)
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "tbl_user")
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long userId;
    // ......
}