이번 개인 프로젝트를 진행하면서, JWT도 같이 적용했었는데, 이때 accessToken은 클라이언트의 localStorage에 들어가도록 구현하고, refreshToken은 Redis에 저장하도록 구현해보았습니다. 이에 대한 회고를 진행해보겠습니다.
좋았던 점
NoSQL에 대해서 들어만 봤어서 어렵진 않을까 생각했는데, 실제로 사용해보니 일단 생각보다 도입이 쉬웠습니다.
레디스는 다양한 데이터 타입을 지원하는데, 이번엔 Set 형태로 활용했습니다.
Redis 효과가 좋다던데 과연 어떨까?
더보기
t2.micro 기준
Redis 도입전 EC2 CPU utilization : 1.8%
도입 후 EC2 CPU utilization : 1.77%
세션 1개 기준 별 차이없는 것 같다...?
Response Time을 확인하는게 더 정확하다는데 아쉽게도 이전 측정치를 알 수 없으니 비교하지 않겠습니다...
이전에는 쿠키에 RefreshToken을 보관하고 DB에도 똑같이 보관했었는데, Redis 도입을 통해서 그 부분의 리소스는 줄지 않았을까 생각해봅니다.
아쉬웠던 점
Aws ElastiCache를 이용했더니 개발환경에서 Redis에 접근할 수 없고, AWS에 배포된 애플리케이션에서만 접근이 가능했습니다.VPC내부망으로만 접속할 수 있기 때문입니다.
그래서 배포하고 EC2에 SSH접속해서 Redis 화면을 확인하는 아주 비효율적인 방법을 택했습니다. 이미 Junit으로 테스트하는게 어느정도 익숙해진 상태였는데, 배포하고 직접 실행해보고 에러가 발생하면 로그를 100줄씩 요청해서 확인하는 작업이 번거로웠습니다.
배운 점
- Redis의 응답속도가 매우 빠릅니다( 메모리에서 데이터를 처리하기 때문 )
- 하지만 데이터 휘발성을 주의해야합니다
- Redis에 저장되는 모든 데이터는 유효기간(time to live)을 설정할 수 있습니다. 저도 이번에 RefreshToken의 유효기간과 일치하게 시간을 설정해두면서 메모리를 효율적으로 사용할 수 있게 했습니다.
- Redis는 다양한 데이터타입을 지원합니다. 이번에는 Sets(문자열집합)를 이용했습니다.(엔티티필드값을저장)
- Redis는 Single Threaded라서 효율적인 시스템 리소스 사용이 가능하고 데이터를 빠르게 처리할 수 있지만, 만약 오래걸리는 작업을 수행하고 있으면 다른 명령어들이 이벤트 큐에 저장되어 있는 시간이 길어져서 응답속도가 저하될 수 있다고 합니다.
- DB가 있는데도 Redis라는 인메모리 데이터 구조 저장소를 사용하는 이유? 사용자가 늘어난다면 데이터베이스 과부하가 발생할 수 있고 느려질 수 있어서 캐시 서버를 함께 활용합니다. 만약 같은 요청이 여러번 들어오는 경우 매번 DB를 거치는 것이 아니라 캐시서버에서 첫 번째 요청 이후 저장된 결괏값을 바로 내려주기때문에 DB의 부하를 줄이고 서비스의 속도도 느려지지 않습니다.
- Redis는 Key,Value의 구조로 이루어져 있습니다. String, Lists, Sets, Sorted Sets, Hashes 자료구조를 지원합니다.
Redis의 자료 구조 | |
---|---|
String | 가장 일반적인 key - value 형태 |
Sets | String의 집합. 여러개의 값을 하나의 Value에 넣을 수 있음 |
Sorted Sets | 중복된 데이터를 담지 않는 Set 구조에 정렬 Sort를 적용한 구조. 랭킹 보드 구현 사용가능 |
Lists | Array 형식의 데이터 구조 |
Hashes | Field와 value로 구성, Hashes는 key하나에 여러개의 field와 value로 구성된다. RDBS 같은 테이블 형태 |
- AWS EC2에서 redis에 접근하려면 GNU 컴파일러와 redis-cli 를 설치해야한다.
# GNU 컴파일러 설치
sudo yum install gcc
# redis-cli 설치
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make distclean # ubuntu에서만 입력!!!!
make
# 생성한 클로스터 접속
src/redis-cli -c -h 엔드포인트 -p 6379
# 테스트
set a "hello"
# -- 응답값
OK
# OK : 정상접속한 것
- Redis 명령어
KEYS * | 저장되어있는 현재의 key들을 리턴 |
GET mykey | mykey라고 지정된 key의 value 리턴 |
SET [key] [value] | 데이터 1건 저장 |
EXISTS [key] | 해당 key의 존재여부 리턴 (1: 존재 / 0 : 미존) |
DEL [key] | 데이 삭제 |
MONITOR | realtime으로 볼 수 있음(성능상 문제 발생 가능) |
앞으로 바라는 점
- 검색해보니 로컬에 Redis를 설치하면 로컬환경에서 테스트 진행이 가능하다고 합니다. 앞으로 로컬에 설치해서 테스트를 진행해봐야겠습니다.
- 쿠키에 있는 refreshToken에 대한 탈취 위험은 사라졌지만 만약 localStorage에 있는 accessToken을 탈취한다면...?
참조 :
Commands
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker
redis.io
[AWS] 프리티어 ElastiCache 생성부터 적용까지
👏 ElastiCache 적용하기
velog.io
'프로젝트 > SpringBoot Side Project' 카테고리의 다른 글
페이지네이션 js 코드 (0) | 2024.03.15 |
---|---|
개인프로젝트에 @CreatedBy 적용하기 (0) | 2024.01.30 |
트러블 슈팅 : 구글 로그인 인증(Google Auth) 승인 오류 403 오류( access_denied) (0) | 2024.01.26 |
트러블 슈팅 : JPA leftjoin N+1 문제 (0) | 2024.01.24 |
대댓글 JPA로 구현하기 (1) | 2024.01.23 |