Spring RedisTemplate null 반환 오류

코모도왕도마뱀·2025년 3월 15일
5

오늘 JWT 리프레시 토큰 로테이트를 구현하려고 했다. 리프레시 토큰을 Redis에 저장해두고, 엑세스 토큰을 발급받을 때 리프레시 토큰을 새로 발급하고 Redis에 저장되어있는 리프레시 토큰을 업데이트하여 서버가 주도권을 가지고 보안을 강화하는 방식으로 진행하려고 했는데... 아이러니하게도 Redis에서 값을 조회했을 때, 계속 null이 반환됐다.

4시간을 온전히 문제 해결에 쏟았지만, 여전히 문제가 해결되지 않았고, 심지어 그 해결책이 웹 검색을 통해 겨우 나왔다. 그 원인이 뭘까? 바로 트랜잭션 문제였다.

문제의 핵심

Redis에서는 트랜잭션을 사용하면 명령어가 커맨드 버퍼에 저장되고, 트랜잭션이 커밋 또는 롤백될 때까지 결과가 반환되지 않는다. 그래서 트랜잭션이 아직 진행 중인 상태에서 값을 조회하게 되면, 커맨드 버퍼에 남아있는 값은 아직 반영되지 않은 상태여서 null이 반환된다.

왜 null이 반환되는 걸까?

트랜잭션이 진행 중일 때, Redis는 명령어를 즉시 실행하는 게 아니라 먼저 버퍼에 저장한다. 그리고 트랜잭션이 끝날 때까지 그 값은 다른 명령에서 조회할 수 없다. 결국, 트랜잭션 커밋이 완료되기 전에 값을 조회하면 예상치 못한 null이 반환되는 것이다.

해결책

문제를 해결하려면 트랜잭션이 완료된 후에 해당 값을 조회해야 한다. 즉, 트랜잭션 커밋 후에 데이터를 다시 요청하면 정상적으로 값이 반환된다.

결론

리프레시 토큰 로테이트를 구현할 때, 트랜잭션 처리에 대한 이해가 부족해서 발생한 문제였다. Redis에서 트랜잭션을 사용할 때는 그 결과가 커밋되거나 롤백될 때까지 다른 세션에서 해당 값을 조회할 수 없다는 점을 유의해야 한다.

이 글을 읽는 사람들은 Redis를 이용할 때 나처럼 삽질하지 않기를 바란다.

profile
생각은 깊게, 실행은 단순하게.

2개의 댓글

comment-user-thumbnail
2025년 3월 18일

우와 뭐냐

1개의 답글