HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🧚
[1기]최종 프로젝트 데브코스
/
[팀12] 기부니🧡
[팀12] 기부니🧡
/
🏷️
기술 정리 & 이슈 관리
/
🎈
Redis를 통한 JWT Refresh Token 관리
🎈

Redis를 통한 JWT Refresh Token 관리

태그

Redis ?


 
 

Access Token과 Refresh Token ?


access token 은 말 그대로 특정 기능에 접근할 수 있도록 하는 권한이 있는 토큰으로, 토큰 자체로 검증을 하여 사용자 권한을 인증한다. 보다 유효 기간이 긴 refresh token을 두어 access token을 재발급 받을 수 있도록 하여 로그인을 유지할 수 있도록 해보쟈!!
 

Redis 설치


맥(mac) 환경에서
brew install redis
 
실행 및 데이터 삽입과 조회
(실행) brew services start redis (중단) brew services stop redis
Redis는 NoSQL이라서 key-value 형식으로 데이터 삽입!!
Redis는 NoSQL이라서 key-value 형식으로 데이터 삽입!!
 

이제 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 키 확인
notion image
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번 }
 
 

토큰 갱신 과정 요약


  1. 로그인할 때 refresh token생성하여 redis에 저장하고 클라이언트에게도 access token과 같이 반환한다.
  1. 토큰을 갱신할 때 입력받은 refresh token값이 유효한지 검증한 후 access token에서 인증 객체를 가지고 온다.
  1. 인증 객체에 저장된 email을 통해 redis에 저장된 refresh token값이 존재하고 그 값과 입력받은 refresh token값과 같은지 확인한다.
  1. 로그인 과정과 같이 인증 객체로 새로운 access token을 생성하고 redis에 새로 생성된 refresh token을 저장 후 새로 발급된 두 토큰 정보를 반환한다.
 
 

(AWS) ElastiCache으로 EC2 서버에 Redis 설정하기


notion image
 
notion image
notion image
 
완료되면 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
 
notion image
notion image
EC2 환경 변수 설정하기 → sudo vi /etc/profile
cache: type: redis redis: host: ${REDIS_ENDPOINT} port: 6379
 
 
 
참고 블로그
[Redis] Redis 개념, AWS EC2환경에서 설치하기
관계형 데이터베이스는 SQL 쿼리를 사용해 테이블 간 데이터를 연결시키는 반면에 , Redis는 SQL이 없는 비 관계형 데이터베이스입니다. Redis에는 테이블이 없으며 Redis의 데이터를 Redis의 다른 데이터와 연결시키는 방법이 존재하지 않습니다. Redis는 두 가지 방식의 디스크 데이터 쓰기 기능을 지원하며, Memcached에서 서비스하는...
https://medium.com/@dlaudtjr07/redis-redis-%EA%B0%9C%EB%85%90-aws-ec2%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-a510cdb9731e
[Redis] Redis 개념, AWS EC2환경에서 설치하기
[AWS] Spring Boot로 ElastiCache 간단한 실습해보기
이번 글에서는 AWS ElastiCache 를 생성하고 아주 간단한 실습을 하는 것을 정리해보겠습니다. 이번 실습에서는 Redis를 사용해서 할 것이기 때문에 Redis 를 체크하겠습니다. 위의 노드 유형을 t2.micro(프리티어) 로 해야 합니다! (Default로 되어 있는 거 쓰면 좋은 성능이라 요금 많이 나옵니다..) 보안그룹은 따로 생성해서 지정해주어도 되고 기존이 6379 포트가 열려있는 보안그룹이 있다면 그것을 사용해도 됩니다.(저도 열려있는 보안그룹이 있기 때문에 그것을 사용하겠습니다.)
[AWS] Spring Boot로 ElastiCache 간단한 실습해보기
https://devlog-wjdrbs96.tistory.com/314
[AWS] Spring Boot로 ElastiCache 간단한 실습해보기
[SpringSecurity] Refresh Token 발급과 Access Token 재발급
https://solchan98.tistory.com/11 jwt는 한 번 발급하면 만료되기 전까지 삭제할 수 없다. 따라서 짧은 유효시간을 갖는 Access Token과 저장소에 저장해서 Access Token을 재발급이 가능한 Refresh Token이 있다. Refresh Token 발급과 관리 및 이를 통한 Access Token 재발급에 대해 알아보자. 본 포스트는 이전 JWT 발급 과정에 이어서 진행된다. 리프레시 토큰을 발급하기 전, 리프레시 토큰이 어떻게 사용되는지 알아보자.
[SpringSecurity] Refresh Token 발급과 Access Token 재발급
https://velog.io/@solchan/SpringBoot-Refresh-Token-%EB%B0%9C%EA%B8%89%EA%B3%BC-Access-Token-%EC%9E%AC%EB%B0%9C%EA%B8%89
[SpringBoot] Redis를 통한 JWT Refresh Token 관리
https://solchan98.tistory.com/13 보통 세션 관리를 위해 Redis를 사용한다. JWT의 Refresh Token도 관리하기 위해선 저장소에 저장이 필요하다. 디스크에 저장하여 관리할 수 있으나, 로그인 아웃 등 세션과 비슷하게 작동하고 로그아웃 된 Refresh Token에 대해서 좀 다르지만 블랙리스트 방식처럼 관리가 필요하기 때문에 Redis를 사용해보자. 이번에는 소스코드의 변경이 매우 적다. 이전 포스트와 방식은 동일하나 저장되는 환경이 디스크가 아닌 인메모리이다.
[SpringBoot] Redis를 통한 JWT Refresh Token 관리
https://velog.io/@solchan/SpringBoot-Redis%EB%A5%BC-%ED%86%B5%ED%95%9C-JWT-Refresh-Token-%EA%B4%80%EB%A6%AC
[SpringBoot] Redis를 통한 JWT Refresh Token 관리
security + jwt + redis 로그인 기능 구현 (최종)
이전 Spring Security + JWT 로그인 구현에서 마지막으로 Refresh Token 저장을 위한 Redis를 추가하고, 토큰 재발급 기능을 추가하여 로그인 기능을 완성하였습니다. 앞서 포스팅 한 Security + JWT 로그인 구현 과정입니다. 이어지는 내용이기 때문에 참고 부탁드리겠습니다. Redis 사용법에 대한 내용입니다. 해당 로그인 기능에서는 RedisTemplate을 사용하여 기능을 구현하였습니다.
security + jwt + redis 로그인 기능 구현 (최종)
https://wildeveloperetrain.tistory.com/59
security + jwt + redis 로그인 기능 구현 (최종)
Access Token + Refresh Token JWT 인증
Access Token(JWT)를 통한 인증 방식의 문제 제 3자에게 탈취당할 경우 보안에 취약하다는 점입니다. 유효기간이 짧은 Token의 경우 그만큼 사용자는 로그인을 자주 해서 새롭게 Token을 발급받아야 하므로 불편합니다. ⇒ 유효기간을 늘리면, 토큰을 탈취당했을 때 보안에 더 취약해지게 됩니다. "유효기간을 짧게 하면서 좋은 방법이 있지는 않을까?"라는 질문의 답이 바로 "Refresh Token"입니다.
Access Token + Refresh Token JWT 인증
https://donologue.tistory.com/397
Access Token + Refresh Token JWT 인증