포시코딩

Redis 본문

Node.js

Redis

포시 2022. 12. 24. 21:53
728x90

개요

처음으로 토큰 기반 로그인 인증을 구현하며 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이라도 쓰임새에 따라 다르기 때문이다. 

 

아래 랭킹을 보자

Key-value stores 랭킹
Document stores 랭킹

출처: 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

https://wlswoo.tistory.com/44

 

[Redis] Redis 설치 및 간단한 사용 방법 (Mac)

Redis는 Remote Dictionary Server의 약자로 key: value로 값을 저장하는 NoSQL입니다. 인-메모리(In-Memory) 데이터베이스로 메모리에 데이터가 저장됩니다. 싱글 쓰레드로 Atomic 합니다. Redis 설치 Brew 설치 mac은

wlswoo.tistory.com

windows

https://kitty-geno.tistory.com/133

 

Redis(레디스) | Windows 10 설치 및 기본 명령어

📌 Redis란 NoSQL의 종류 중 하나로 메모리 기반 Key-Value Storage 형 구조의 데이터 관리 시스템이다. 시스템 메모리를 사용하는 특징이 있으며, 문서형 NoSQL인 MongoDB 보다 빠르고 가볍게 동작하며 I/O

kitty-geno.tistory.com

 

설치

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에 저장하게끔 변경해봤다.

728x90