Redis ?
Access Token과 Refresh Token ?
access token
은 말 그대로 특정 기능에 접근할 수 있도록 하는 권한이 있는 토큰으로, 토큰 자체로 검증을 하여 사용자 권한을 인증한다. 보다 유효 기간이 긴 refresh token
을 두어 access token
을 재발급 받을 수 있도록 하여 로그인을 유지할 수 있도록 해보쟈!!Redis 설치
맥(mac) 환경에서
brew install redis
실행 및 데이터 삽입과 조회
(실행) brew services start redis (중단) brew services stop redis

이제 Spring Boot에 적용해보자!
application-dev.yml 설정 추가(로컬용)
spring: cache: type: redis redis: host: localhost port: 6379
Redis 설정
@Configuration @EnableRedisRepositories @RequiredArgsConstructor public class RedisConfig { private final RedisProperties redisProperties; @Bean public RedisConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory( redisProperties.getHost(), redisProperties.getPort() ); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); return redisTemplate; } }
private final RedisTemplate redisTemplate; public TokenResponse login(LoginRequest login) { findActiveMemberAndCenter(login.getEmail()); // 1. Login ID/PW 를 기반으로 Authentication 객체 생성 // 이때 authentication는 인증 여부를 확인하는 authenticated 값이 false UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( login.getEmail(), login.getPassword() ); // 2. 실제 검증 (사용자 비밀번호 체크)이 이루어지는 부분 // authenticate()가 실행될 때 CustomUserDetailsService에서 만든 loadUserByUsername()가 실행 Authentication authentication = authManagerBuilder.getObject() .authenticate(authenticationToken); // 3. 인증 정보를 기반으로 JWT 토큰 생성 TokenResponse tokenInfo = jwtTokenProvider.generateToken(authentication); // 4. RefreshToken Redis 저장 redisTemplate.opsForValue() .set( "RT:" + authentication.getName(), tokenInfo.getRefreshToken(), tokenInfo.getRefreshTokenExpirationTime(), TimeUnit.MILLISECONDS ); return tokenInfo; }
로컬 Redis 키 확인

public Response.TokenInfo reissue(Request.Reissue reissue) { // refresh token 유효성 검사 & 인증 객체 반환 Authentication authentication = getAuthentication( reissue.getAccessToken(), reissue.getRefreshToken() ); // 인증 객체 email를 통해 redis에 저장된 refresh token 반환 String refreshToken = redisTemplate.opsForValue() .get("RT:" + authentication.getName()); if (ObjectUtils.isEmpty(refreshToken)) { throw new RefreshTokenException(ErrorCode.NOT_FOUND_REFRESH_TOKEN); } if (!refreshToken.equals(reissue.getRefreshToken())) { throw new RefreshTokenException(ErrorCode.NOT_MATCH_REFRESH_TOKEN); } return getTokenResponse(authentication); // 로그인 기능의 3, 4번 }
토큰 갱신 과정 요약
- 로그인할 때
refresh token
생성하여redis
에 저장하고 클라이언트에게도access token
과 같이 반환한다.
- 토큰을 갱신할 때 입력받은
refresh token
값이 유효한지 검증한 후access token
에서 인증 객체를 가지고 온다.
- 인증 객체에 저장된 email을 통해 redis에 저장된
refresh token
값이 존재하고 그 값과 입력받은refresh token
값과 같은지 확인한다.
- 로그인 과정과 같이 인증 객체로 새로운
access token
을 생성하고 redis에 새로 생성된refresh token
을 저장 후 새로 발급된 두 토큰 정보를 반환한다.
(AWS) ElastiCache으로 EC2 서버에 Redis 설정하기



완료되면 EC2 서버에 접속해서
ElastiCache
접속해보기# make 하기 위핸 gcc 다운 sudo yum install -y gcc # redis-cli 설치 및 make wget http://download.redis.io/redis-stable.tar.gz && tar xvzf redis-stable.tar.gz && cd redis-stable && make # redis-cli를 bin에 추가해 어느 위치서든 사용 가능하게 등록 sudo cp src/redis-cli /usr/bin/ (접속 방법) redis-cli -h 엔드포인트 -p 6379


EC2 환경 변수 설정하기 → sudo vi /etc/profile
cache: type: redis redis: host: ${REDIS_ENDPOINT} port: 6379
참고 블로그