Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

JWT 저장 Redis 적용기 본문

Middleware/Redis (캐시)

JWT 저장 Redis 적용기

studyHub 2025. 7. 27. 18:57

소셜 로그인 시 JWT(Access Token, Refresh Token)을 발행한다.

Refresh Token을 저장할 용도와,

로그아웃, 탈퇴 시 Access Token을 Blacklisting할 용도로 Redis를 도입할 예정이다.


EC2 서버에 Redis 설치하여 적용하기 (개발계)

개발계 서버에는 EC2에 직접 Redis를 설치하여 적용할 예정이다.

우선 로컬 서버에는 Redis를 직접 설정하고, 개발계는 docker를 이용해 redis 설정을 적용한다.

 

로컬에 Redis 적용하기

1. 로컬에 redis 설치

2. Springboot에 Redis 적용하기

1) 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

 

 

2) Redis 제어 방식

RedisTemplate: Spring Data Redis에서 제공하는 클래스이며 Redis와 상호작용하기 위한 핵심 객체로, Redis 명령어를 Java 메서드로 제공한다.

RedisTemplate로 직접 저장할 경우 캐시 매니저 없이도 충분히 제어 가능하며, 더 직접적이고 세밀한 제어가 가능하다.

 

@Cacheable vs RedisTemplate

용도 읽기 캐시 (조회 결과 캐싱) 읽기/쓰기 모두, 세션/토큰 저장 등
사용 방식 선언적 (@Cacheable, @CacheEvict) 프로그래밍적 (set, get 직접 호출)
간편성 매우 간단 (로직 최소화) 유연한 제어 가능 (TTL, key, 삭제 등)
TTL 제어 CacheManager 설정 필요 Duration으로 개별 설정 가능
직렬화 설정 전체 캐시 설정에서 통합 관리 키별로 개별 설정 가능
적합한 경우 조회 API, 코드 테이블, 빈번히 반복되는 응답 JWT, refresh token, 세션, 인증 상태 저장 등

 

3) Refresh Token 저장하기

 

DB와 Redis를 병행 저장할 수도 있지만, 대부분은 Redis 한 곳만 사용하는 경우가 많다.

 

  • key: refresh_token:<user_id>
    value: 실제 토큰 문자열 or JTI(UUID)
  • TTL(Time to Live) 기능으로 만료 자동 관리
  • Redis 날리면 토큰도 다 날아감 → persistence 설정 필수

 


3. Persistence 적용

persistence(지속성) 설정을 통해 디스크에 주기적으로 저장하거나 로그를 남겨야한다.

Persistence는 Redis 서버 설정의 영역으로, Spring에서 설정하지 않는다.

 

Redis Persistence 종류

1. RDB (Redis DataBase) — 스냅샷 방식

  • 일정 시간 간격으로 전체 메모리 상태를 snapshot(덤프) 떠서 .rdb 파일로 저장
  • 장점: 복구 빠름, 파일 용량 작음
  • 단점: 마지막 스냅샷 이후 데이터는 복구 안됨

설정 예시 (redis.conf)

save 900 1       # 15분(900초) 동안 1건 이상 변경되면 저장
save 300 10      # 5분 동안 10건 이상 변경되면 저장
save 60 10000    # 1분 동안 10,000건 이상 변경되면 저장

 

❗ Redis를 재시작하면 가장 마지막 .rdb 상태로 복구됨 (중간에 바뀐 내용은 손실됨)

 

2. AOF (Append Only File) — 명령어 로그 방식

  • Redis에서 실행된 모든 write 명령어를 append-only.log 형태로 기록
  • Redis가 재시작되면 이 로그를 다시 replay해서 데이터 복원

설정 예시 (redis.conf)

appendonly yes
appendfsync everysec   # 1초마다 디스크에 flush (성능/지속성 밸런스 좋음)
❗ AOF 파일은 점점 커지기 때문에, 백그라운드에서 rewrite 작업도 필요

 

RDB + AOF 병행 사용 (권장)

  • RDB는 빠른 복구와 백업용
  • AOF는 신뢰성 높은 영속성 보장
  • Redis 4.0 이후는 appendonly yes일 경우 AOF + RDB 하이브리드 자동 사용 가능
save 300 1            # 최소한의 RDB 설정
appendonly yes        # AOF 활성화
appendfsync everysec  # 1초마다 디스크에 flush

 

적용

RDB는 기본 save 규칙이 이미 있으므로 필요 시 조정하면 되고,

AOF(append-only file) 기본은 끄기(appendonly no) 이므로 켜려면 appendonly yes로 설정해야 한다.

 

docker run -d --name redis \
  -p 6379:6379 \
  redis:7-alpine \
  redis-server --appendonly yes --appendfsync everysec

캐시가 아니라 인증 데이터 저장소 용도로 쓸 경우

JWT 저장/검증 용도라면 캐싱 전략은 쓰지 않는게 정석이다. 그냥 JWT를 저장하고 만료되면 삭제되게하면 된다.

Persistence 적용은 권장된다. Refresh Token 분실, Blacklist 분실에 대응하기 위해서다.


Doker로 로컬 적용하기

intelliJ로 애플리케이션을 띄우고, db는 메모리 db를 사용하고, redis만 도커로 띄우면 된다.

(Apple .p8, AWS credentials는 로컬에 저장. docker 컨테이너에서 intelliJ를 실행하는게 아니니깐)

 


Doker로 개발계 적용하기

Apple .p8, AWS credentials을 이미지로 포함(COPY)하는 건 안된다. 이미지 유출될 경우 보안 사고 리스크가 크다.

대신 런타임에 주입한다.

- AWS 자격증명: EC2에 IAM Role 부여 → 컨테이너에서 자동 인식(AWS SDK 기본 체인)

- .p8: 호스트의 안전한 경로에 저장 후 read-only 볼륨 마운트로 주입

 

EC2에 환경 셋팅을 한다면 굳이 컨테이너를 사용할 필요가 있나?

컨테이너에서도 EC2의 설정을 읽을 수 있다

 

  • IAM Role: 컨테이너 안의 AWS SDK가 IMDSv2(169.254.169.254) 를 통해 EC2 인스턴스 프로파일 자격증명을 자동 획득(차단만 안 되어 있다면 OK).
  • 환경변수: docker compose의 environment로 주입
  • 파일(.p8 등): 호스트 경로를 볼륨 마운트(:ro)로 런타임 주입

 

 

 

 

  • 로컬: IntelliJ로 앱 실행 + Redis만 Docker
  • 개발계: app + Postgres + Redis (3 컨테이너 / Compose)
  • 운영계: app 컨테이너만, DB/Redis는 RDS/ElastiCache로 외부 연결
  • 장점: 개발·운영 런타임 일관성, 이미지 태그로 배포·롤백 용이, 인프라 분리 쉬움
  • 배포: GitHub Actions가 Docker 이미지를 빌드 → 레지스트리에 푸시 → EC2에 접속해 docker compose pull/up 실행하는 흐름

 


 

운영계에 AWS ElastiCache 도입하기

ElastiCache 설정하는 방법은 이전 글을 참고하라.

 

운영 시스템에는 보안을 위해 TLS(전송 구간 암호화)와 ACL(username/password 인증)이 권장된다.

보안그룹은 EC2  ↔ Redis만 허용한다.

 

TLS(Transport Layer Security) 적용하기

패킷 도청/변조 방지, 서버 신뢰 검증을 위해 사용한다.

ElastiCache에서는 In-transit encryption 옵션으로 제공한다.

클라이언트는 TLS로 접속해야 한다.(redis-cli --tls, Spring에서 ssl.enabled: true)

ElastiCache(TLS 사용)에서는 별도로 인증서를 준비하지 않아도 된다.

(ElastiCache에서 in-transit encryption (TLS) 옵션을 켜면, AWS가 서버 쪽 인증서를 자동으로 발급하고 갱신해준다)

 

ACL(Access Control List) 적용하기

ElastiCache에서 사용자와 사용자 그룹을 만들고 클러스터에 사용자 그룹을 연결한다.

 

보안그룹

인바운드 source에 EC2의 Security group을 넣으면, 해당 SG가 붙은 인스턴스에서 오는 연결만 허용한다.

(EC2 SG를 ElastiCache SG에 “소스로 참조” 하는 것이지, EC2 SG를 ElastiCache에 “붙이는” 게 아니다.)

 

AWS 설정
springboot 설


EC2에서 연결 테스트

docker run --rm -it redis:7-alpine \
redis-cli \
-h master.capturecat-cache-server.uty8s8.apn2.cache.amazonaws.com \
-p 6379 \
--tls \
--sni master.capturecat-cache-server.uty8s8.apn2.cache.amazonaws.com \
--user capturecat-server \
-a 패스워드 \
PING

'Middleware > Redis (캐시)' 카테고리의 다른 글

Redis 실전 활용 (feat. AWS ElastiCache)  (1) 2025.02.28
Redis 기본  (0) 2025.02.26