본문 바로가기
Spring Security

AWS EC2 에서 Elastic Cache(Redis) 연결하여 JWT RefreshToken 저장하기

by asdft 2024. 5. 25.

1) EC2 접속 후 아래와 같은 명령어를 입력한다.

sudo apt-get update
sudo apt-get install build-essential wget

wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz

cd redis-stable
make distclean 
make

src/redis-cli -c -h yourcachecluster.yourregion.cache.amazonaws.com -p 6379

 

참고) Elastic Cache Redis를 생성하고 몇 분이 지나면 아래와 같이 Redis Cache의 엔드포인트 주소를 알 수 있다.

 

Elastic CacheRedis

 

생성한 Redis의 기본 엔드포인트의 주소를

src/redis-cli -c -h yourcachecluster.yourregion.cache.amazonaws.com -p 6379

표시한 부분에 넣어준다. ' -h '는 호스트의 주소 즉 Redis의 기본 엔드포인트 주소를 의미하고 ' -p '는 포트번호를 의미한다. ' -c '  옵션은 클라이언트가 클러스터 모드에서 실행 중임을 명시하고, 클러스터 노드 간의 리다이렉션을 자동으로 처리하도록 한다. 이를 통해 클라이언트가 특정 키를 처리하는 올바른 노드로 자동으로 연결된다.

 

' -c ' 옵션 없이 redis-cli를 실행하면 클라이언트는 리다이렉션을 자동으로 처리하지 않으므로, 클러스터 모드에서는 각 명령을 올바른 노드로 수동으로 라우팅해야 한다. 이는 실수할 가능성이 높고, 클러스터의 장점을 충분히 활용하지 못하게 된다.

 

예를 들어, ' -c ' 옵션 없이 redis-cli를 사용하면 다음과 같은 오류가 발생할 수 있다.

127.0.0.1:7000> set a "hello"
(error) MOVED 15495 127.0.0.1:7001

이 오류 메시지는 키 a127.0.0.1:7001 노드에 저장되어야 한다는 것을 의미한다. -c 옵션을 사용하면 클라이언트가 자동으로 올바른 노드로 요청을 리다이렉트 한다.

 

 

위의 명령어를 입력 후 " ls " 명령어로 파일 목록을 출력해보면 " redis-stable " 파일이 생성되어 있을 것이다.

[Ec2 ip address 보안]:~$ ls
redis-stable  redis-stable.tar.gz

 

 

 

2) Postman 에서 EC2에 배포한 IP 주소로 Login API의 ' POST ' 요청을 보내보자

{
    "grantType": "Bearer",
    "accessToken": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyIiwiYXV0aCI6IlJPTEVfVVNFUiIsImV4cCI6MTcxNjYxNzA5N30.kF05qJodSdRGNqayHt2YJGU9_cMugzXreBmpjDXCPVL8f62prpAHFCsie9Fqj-0WATZQJfYxxrcQdJMoDllZEw",
    "refreshToken": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE3MTY4NzQ0OTd9.KimDTyD1Dzf1nPcv6HlL4lncCXohyl4ZptVdf8Edxc95WXwTR6tw6TITgJpOqoA9kCCkRJzJXc6RhJNI5cAVYQ",
    "accessTokenExpiresIn": 1716617097520
}

 

 

PostMan으로 EC2상의 배포한 주소로 Login 요청을 보내면 위와 같이 AccessToken과 RefreshToken이 발급된다.

 

 

3) EC2에서 redis-stable 파일로 이동 후, redis-cli 실행

[EC2 IP]:~$ cd redis-stable
[EC2 IP]:~/redis-stable$ src/redis-cli -c -h [Elastic Cache Redis Endpoint] -p 6379

[Elastic Cache Redis Endpoint]:6379> keys *
1) "2"
[Elastic Cache Redis Endpoint]:6379> get 2
"eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE3MTY4NzQ0OTd9.KimDTyD1Dzf1nPcv6HlL4lncCXohyl4ZptVdf8Edxc95WXwTR6tw6TITgJpOqoA9kCCkRJzJXc6RhJNI5cAVYQ"
[Elastic Cache Redis Endpoint]:6379> TTL 2
(integer) 7159
keys *   :   Redis 캐시에 존재하는 모든 key값 출력
get [key]   :   key값에 해당하는 value값 출력
TTL [key]   :   유효기간 (초).  TTL (Time-To-Live)가 지나면 Redis에서 자동 삭제된다.

 

[Elastic Cache Redis Endpoint] 부분에 생성한 Redis의 엔드포인트 주소를 입력한다.

 

나는 Redis에 key-value를 "member_id" - "RefreshToken" 형태로 저장했기 때문에, 로그인 할때 입력한 email인 

"review@gmail.com"의 member_id인 2를 key값으로 검색했다.

 

위의 PostMan에서 응답값으로 발급받은 RefreshToken과 Redis에서 출력한 RefreshToken값이 동일한 것을 확인 할 수 있다.

 

 

이로써 발급받은 RefreshToken이 AWS Elastic Cache인 Redis에 잘 저장되는 것을 확인할 수 있다.

 

 

4) SpringBoot에 연결하기

1. 배포한 spring-boot 파일의 application.yml 파일에 아래와 같이 설정을 해야한다.

나는 redisRepository가 아닌 redisTemplate 방법으로 jwt토큰을 저장 했다.

 

--- >> redisTemplate을 사용하는 경우 ' repositories: enabled: false ' 옵션을 추가하지 않으면 default인 redisRepositoy를 사용하는줄 알고 모든 레포지토리 인터페이스중 어떤 것이 redisRepository 인지 탐색하기 때문에 오류가 발생한다

  data:
    redis:
      repositories:
        enabled: false
      host: [Elastic Cache Redis Endpoint]
      port: 6379

 

 

2. build.gradle 추가

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

 

 

완료~~!