프로젝트 (Java)/예약마켓

[프로젝트] 23. 로그아웃 기능을 위한 Redis 추가

hihyuk 2024. 1. 29. 09:28

프로젝트에 로그아웃 기능을 위해 Redis를 추가하는 것은 세션 관리 및 토큰 무효화를 효과적으로 처리할 수 있게 합니다. Redis는 빠른 데이터 처리 속도와 다양한 데이터 구조를 지원하는 인메모리 데이터 저장소로, 분산 세션 관리, 캐싱, 메시지 브로커 등 다양한 용도로 사용됩니다. 로그아웃 기능에서 Redis를 사용하는 주요 목적은 사용자의 JWT 토큰을 저장하여 유효성을 관리하는 것입니다. 

 

Gradle 설정

build.gradle 파일에 Redis와 관련된 의존성을 추가합니다. Spring Boot는 Redis를 위한 spring-boot-starter-data-redis 스타터를 제공합니다.

// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

 

Docker Compose를 이용한 Redis 컨테이너 설정

docker-compose.yml 파일에 Redis 서비스를 추가하여 로컬 개발 환경에서 Redis 인스턴스를 쉽게 실행할 수 있도록 합니다.

  cache-database:
    image: redis
    container_name: spring_cache
    expose:
      - 6379
    ports:
      - "6379:6379"

 

RedisConfig 설정

RedisConfig 클래스를 생성하여 Spring Boot 애플리케이션에서 Redis를 사용할 수 있도록 구성합니다. 이 클래스는 Redis 연결과 데이터 직렬화 방식을 정의합니다.

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());

        // 일반적인 key:value의 경우 시리얼라이저
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        // Hash를 사용할 경우 시리얼라이저
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());

        // 모든 경우
        redisTemplate.setDefaultSerializer(new StringRedisSerializer());

        return redisTemplate;
    }
}

 

application.yml 설정

application.yml 파일에 Redis 서버의 호스트와 포트 정보를 설정합니다. 이 정보는 RedisConfig 클래스에서 사용됩니다.

  redis:
    host: localhost
    port: 6379

 

Redis를 이용한 로그아웃 기능 구현

로그아웃 기능에서 Redis를 사용하는 방법은 로그인 시 발급된 JWT 토큰을 Redis에 저장하고, 로그아웃 요청 시 해당 토큰을 Redis에서 삭제하거나 무효화하는 방식으로 진행됩니다. 사용자가 로그아웃을 요청하면, 해당 사용자의 토큰을 Redis에서 찾아 삭제하거나 만료 시간을 업데이트하여 더 이상 유효하지 않도록 처리합니다.

 

결론

이러한 접근 방식은 토큰의 유효성을 실시간으로 관리할 수 있게 하며, 분산된 시스템 환경에서도 일관된 세션 관리를 가능하게 합니다. Redis를 사용한 로그아웃 기능 구현은 애플리케이션의 보안을 강화하고, 사용자 경험을 향상시키는 중요한 요소가 됩니다.