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
참고 블로그
![[팀12] 기부니🧡](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4d3c7111-b629-432b-8af2-5dad455cb1f7%2Fneed-it-dark.png?table=block&id=f41327b8-ca6b-4ec6-9487-af702393c922&cache=v2)
![[Redis] Redis 개념, AWS EC2환경에서 설치하기](https://www.notion.so/image/https%3A%2F%2Fmiro.medium.com%2Fmax%2F938%2F1*PDZ9NqYDlM6fpK7JCkC3Iw.png?table=block&id=fb41f19b-a252-49cf-916a-4722e48929dc&cache=v2)
![[SpringBoot] Redis를 통한 JWT Refresh Token 관리](https://www.notion.so/image/https%3A%2F%2Fmedia.vlpt.us%2Fimages%2Fsolchan%2Fpost%2F81dfe243-85a3-4662-85a4-be32d81caea4%2F1100px_Redis_Logo_01%2520(1).png%3Fw%3D768?table=block&id=1e34b1ed-8d14-4cc1-b83e-68e997e67363&cache=v2)