배경 및 문제 발생
프로젝트의 보안 강화를 위해 JWT 토큰 기반 인증 시스템에 Redis를 도입하여 토큰의 만료 시간 관리를 계획했습니다. 목표는 JWT 토큰의 만료와 동시에 Redis 내에 저장된 토큰 정보도 자동으로 삭제되도록 하는 것이었습니다. 그러나 초기 구현 후, 예상치 못하게 토큰이 만료된 이후에도 Redis 내 토큰 정보가 지속적으로 남아 있는 문제에 직면했습니다.
문제 진단
"아, 왜 Redis에서 토큰 정보가 계속 남아있지?"라는 의문으로부터 시작된 트러블슈팅 과정은, 처음에는 Redis의 설정 누락을 간과하고 있음을 발견하는 것이었습니다. Redis에 JWT 토큰과 동일한 만료 시간을 설정하는 중요한 단계가 빠져 있었기 때문에, 토큰은 만료되었으나 Redis 내에는 그 정보가 계속 남아있게 된 것입니다.
해결 과정
이 문제를 해결하기 위해, 다음과 같은 접근 방식을 채택했습니다:
1. Redis 만료 시간 설정 추가: JwtTokenProvider 클래스 내에 JWT 토큰 생성 로직에 Redis에 토큰 정보를 저장하는 코드를 추가하고, JWT 토큰의 만료 시간과 동일하게 Redis에서의 만료 시간을 설정하는 로직을 구현했습니다.
JwtTokenProvider
// JwtTokenProvider 수정 - 토큰 생성 및 Redis 저장 로직
public String createToken(String userPk) {
Claims claims = Jwts.claims().setSubject(userPk);
Date now = new Date();
return Jwts.builder()
String token = Jwts.builder()
.setClaims(claims)
.setIssuedAt(now)
.setExpiration(new Date(now.getTime() + tokenValidTime))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
// Redis에 토큰 저장 및 만료 시간 설정
String redisKey = "JWT_TOKEN:" + userPk;
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
valueOperations.set(redisKey, token, tokenValidTime, TimeUnit.MILLISECONDS);
return token;
}
이 과정에서, Redis에 토큰 정보를 저장할 때 set 메소드를 사용하여 토큰 값과 함께 만료 시간을 TimeUnit.MILLISECONDS 단위로 설정함으로써, JWT 토큰의 만료 시간과 Redis 내 토큰 정보의 만료 시간을 동기화했습니다.
결론 및 고찰
Redis를 통한 JWT 토큰 만료 시간 관리 기능의 도입은 프로젝트의 보안성 향상에 큰 기여를 했습니다. 이 트러블슈팅 과정을 통해, 초기 설정의 누락이 시스템의 보안 메커니즘에 얼마나 큰 영향을 미칠 수 있는지 확인할 수 있었습니다. Redis에 토큰 만료 시간을 명시적으로 설정함으로써, 토큰이 만료되면 Redis에서도 자동으로 해당 정보가 삭제되도록 하는 자동화된 토큰 관리 방식을 성공적으로 구현할 수 있었습니다. 이 경험은 앞으로의 프로젝트에서 인증 시스템의 보안성을 강화하는 데 중요한 교훈이 될 것입니다.
'프로젝트 (Java) > 예약마켓' 카테고리의 다른 글
[프로젝트] 38. WebClient 활용 Rest API 구현 (0) | 2024.02.02 |
---|---|
[프로젝트] 37. MSA(MicroService Architecture) 도입 (0) | 2024.02.02 |
[프로젝트] 35. Swagger 추가 (0) | 2024.01.31 |
[프로젝트] 34. 토큰 검증시 로그 확인 기능 추가 (0) | 2024.01.31 |
[프로젝트] 33. 뉴스피드 조회 기능 리팩토링 (0) | 2024.01.31 |