일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- typeORM
- mongoose
- 자료구조
- GIT
- AWS
- JavaScript
- Queue
- MongoDB
- Bull
- react
- 게임
- dfs
- nestjs
- OCR
- Express
- cookie
- Sequelize
- flask
- game
- 정렬
- nodejs
- 공룡게임
- TypeScript
- MySQL
- Python
- class
- jest
- Dinosaur
- Nest.js
- Today
- Total
포시코딩
Redis 본문
개요
처음으로 토큰 기반 로그인 인증을 구현하며 access token과 refresh token을 다루게 되었는데
refresh token을 저장하는 방법으로 그냥 다른 데이터들 처럼
MySQL에 Token 테이블을 만들어 저장했었다.
그랬더니 이미 사용된 후의 token 데이터들이 계속 쌓이고
짧은 access token 만료시간으로 인해 middleware 통과할때마다 refresh token으로 위 데이터를 조회하고 있었다.
사실 refresh token은 redis에 저장하는게 제일 좋다고 배워서 그렇게 하고 싶었으나
하루동안의 삽질 뒤에 포기하고 MySQL로 도망간거였음
이번에 시간이 되서 제대로 다시 해보고 난 다음 정리하게 되었다.
왜 redis?
최근에 MongoDB 다루는 법도 배웠었고 잘 사용해봐서 NoSQL 쓸거면
익숙한 MongoDB에 refresh token을 저장하면 되는데 왜 Redis를 쓰냐고 한다면
같은 NoSQL이라도 쓰임새에 따라 다르기 때문이다.
아래 랭킹을 보자
출처: https://db-engines.com/en/ranking
Document Store 부문에서는 MongoDB가 압도적 1등이고
Redis는 Key-value Store 부문에서 1등인 것을 볼 수 있다.
우리가 저장하려는 refresh token도 key-value 형태로 저장하면 되기 때문에
그쪽 업계 1위인 Redis를 사용하는게 좋아보인다는 단순한 결론을 내릴 수 있다.
물론 구체적으로 MongoDB보다 Redis를 쓰는 이유를 들라면
단 하나의 이유로 설명이 가능하다.
개 빠르니까.
참고로 이 장점을 누리기 위해선 서버에 local로 redis를 설치해서 사용해주는게 좋다.
애초에 redis는 vpn같은거로 막혀 있어서 다른 pc에서 접속이 불가능하다고 알고 있다.
무료 cloud redis 서버도 있어서 써봤는데 별로임
직접 Redis를 구현해보자
사용 방법 - Terminal
mac
windows
https://kitty-geno.tistory.com/133
설치
brew install redis
실행 방법
brew services start redis
brew services stop redis
brew services restart redis
redis-cli
연결 테스트
ping
사용 방법 - Node.js
npm i redis
utils/redis.util.js (모듈화)
const redis = require('redis');
const redisClient = redis.createClient();
redisClient.on('connect', () => {
console.log('redis connection success');
});
redisClient.on('error', (err) => {
console.log('redis connection error');
console.log(err);
});
redisClient.connect();
module.exports = redisClient;
service (저장)
const redisClient = require('../utils/redis.util');
login = async (email, password) => {
try {
// ...생략
await redisClient.set(refreshToken, user.id);
const TTL = parseInt(process.env.REDIS_REFRESH_TTL); // 초 단위
await redisClient.expire(refreshToken, TTL); // 만료기간 설정
authMiddleware (확인)
const redisClient = require('../utils/redis.util');
userId = await redisClient.get(refreshToken);
이런식으로 기존의 MySQL DB Table에 저장하던 부분을
간단하게 쿠키 메모리인 redis에 저장하게끔 변경해봤다.
'Node.js' 카테고리의 다른 글
객체 지향 프로그래밍 (Object-Oriented Programming, OOP) (0) | 2022.12.26 |
---|---|
객체지향(Object-Oriented) (0) | 2022.12.26 |
[Sequelize] SQL 쿼리(Raw Query) 그대로 사용하기 - Sequelize.query (0) | 2022.12.23 |
[Sequelize] createdAt, updatedAt 컬럼 없는 테이블 다루기 (0) | 2022.12.22 |
[Sequelize] migration을 이용한 Table 속성 변경 방법들 (0) | 2022.12.22 |