Redis 데이터베이스

변현섭·2023년 6월 30일
0

Spring 잡학사전

목록 보기
5/10

# 로그아웃 로직을 공부하기 전에..

1. Redis의 필요성

이번 포스팅에서 설명하기로 한 Redis에 대해서 먼저 설명하겠다. Redis란, 우리가 NoSQL이라 불러온 key-value 데이터베이스의 일종이다. NoSQL에 대한 자세한 설명은 아래의 링크를 참조하기 바란다.
>> NoSQL 설명

Redis는 NoSQL 기반이기 때문에 매우 빠르게 액세스가 가능하다. 근데 아마 가장 궁금해 할만한 부분은 "왜 데이터베이스가 있는데 굳이 Redis 데이터베이스를 또 사용해야 하는가"일 것이다. 블랙토큰을 저장하는 Repository를 만들어서 관리하면 되지 않을까?

물론, 그렇게 해도 상관은 없지만, 매우 비효율적일 것이다. 예를 들어 로그아웃된 사용자의 access token 값이 BlackTokenRepository에 저장된다고 해보자. 하루에 수백, 수천 명의 사용자가 로그아웃을 하고, 다음날과 그 다음날에도 계속 반복된다. 그럼 Repository는 어떻게 될까? 관리자가 따로 delete 하지 않는 한 계속 쌓여만 갈 것이다.

access token은 token의 유효 기간을 넘기면, 쓸 수 없기 때문에 만료된 토큰을 굳이 Repository에 저장하고 있을 필요가 없다. 즉, access token의 만료와 동시에 DB에서 자동 삭제되도록 구현하면 편의성이 매우 높아진다는 것이다. 바로 이 자동화 기능을 이용하기 위해 로그아웃에 Redis 서버를 이용한다.

꼭 자동화를 위해서가 아니더라도 Redis를 사용하는 이유는 다양하다. Redis는 캐시 서버로서, 한번 읽어온 데이터를 임의의 공간에 저장하므로, 동일한 요청에 대해 빠르게 결과 값을 얻을 수 있다. 그러므로 사용자가 많은 서비스에 대해 DB의 부하를 줄이고, 서비스의 속도도 느려지지 않게 하는 장점이 있다.

2. Redis 서버 윈도우에서 실행하기

지금부터 Redis를 사용하는 방법을 알아보자. 실제 배포는 리눅스 환경에서 진행할 것이지만, 로컬 환경(Window OS)에서 API를 테스트 해보기 위해 로컬환경에도 설치해주는 것이 좋다. 아래의 사이트를 참고하여 설치를 진행하였다.
>> Inpa Dev님 블로그

① Redis 다운로드

② Redis 서버 실행

  • 설치가 완료되면 자동으로 시작된다. 작업 관리자를 통해 실행 여부를 확인할 수 있다.
  • 또는 내 컴퓨터 > 로컬디스크 C > Program Files > Redis > redis-server 실행파일을 클릭해 수동으로 실행할 수도 있다.

③ 실행창 열기

  • 내 컴퓨터 > 로컬디스크 C > Program Files > Redis > redis-cli를 누르면 실행창이 열린다.

④ 블랙 토큰 확인하기

  • cli 창에 KEYS * 을 입력하여 블랙리스트에 올라간 토큰들을 확인할 수 있다.
  • 이 블랙 토큰으로 보낸 요청은 모두 거부된다.

⑤ 로컬 환경에서 로그 아웃 API 테스트

  • postman에서 로그아웃 API를 사용하여 Chrome을 로그아웃한다.
  • Redis에 로그아웃 요청 헤더의 Authorization 필드에 있던 access token이 저장되어 있는 것을 확인할 수 있다.

3. Redis 서버 EC2 환경에서 사용하기

실제 서비스 환경을 위해서는 EC2 환경에 설치해야 한다.

① Redis CLI 설치

  • putty 또는 IntelliJ의 SSH 세션(Tools > Start SSH Session)에서 EC2의 IP에 접속한다.
  • 아래의 명령을 차례대로 입력한다.
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install redis-server
$ redis-server --version // 설치 확인

② 기초 설정 변경

  • vi 편집기로 설정 파일을 연다.
sudo vi /etc/redis/redis.conf
  • 아래와 같이 최대 메모리 사양을 256mb로 변경한다.

    ※ vi에서 문자열 검색하기
    command 모드에서 "/찾을 문자열"을 입력하고(""는 입력하지 않는다) 엔터를 누르면 가장 먼저 일치하는 문자열로 이동한다. 그 때부터 n버튼을 누르면 일치하는 다음 문자열로 이동한다. 이를 통해 maxmemory를 찾아 변경하면 된다.

  • 메모리 초과 사용시 처리 방식을 allkeys-lru로 설정한다. allkeys-lru 옵션은 가장 오래된 데이터를 삭제하고, 새로운 데이터를 저장하는 옵션이다.

  • 포트번호는 원하는대로 설정하면 된다. default 포트인 6379 그대로 설정해주었다.

  • 외부접속 허용을 위해 bind 0.0.0.0으로 바꾸어준다. 이렇게 하면 모든 외부 접속을 허용하게 된다.

  • 설정 파일을 저장하고 vi를 빠져나온다.

③ Redis 재시작

  • Redis의 변경사항을 적용하기 위해 아래의 명령을 입력해 Redis를 재시작한다.
 sudo systemctl restart redis-server.service

④ 보안그룹 변경

  • AWS 보안그룹으로 들어가 Redis를 위한 포트를 열어줘야 한다.
  • Redis의 default 포트 번호는 6379이다. 현재 사용하고 있는 EC2의 보안그룹을 아래와 같이 수정한다.

⑤ Redis 정상 동작 확인

  • redis-cli ping을 입력했을 때 PONG이 출력되면 정상 동작하고 있는 것이다.
  • redis-cli를 입력하면 우리가 윈도우에서 테스트 해보았던 redis-cli.exe와 동일하게 동작하는 것을 확인할 수 있다.
  • quit을 입력하면 빠져나올 수 있다.

4. EC2 환경에서 로그아웃 API 테스트

① EC2 환경에 파일 빌드하기

  • 저번 포스팅에서 제공한 파일을 본인의 EC2 환경에서 빌드한다.
  • yml 파일은 포함되어 있지 않기 때문에 직접 작성해서 넣어주어야 한다.
  • yml 파일을 작성하여 넣는 방법도 아래의 링크에서 확인할 수 있다.
    >> EC2에서 프로젝트 빌드하는 방법

② 두가지 방법으로 Redis의 동작을 확인할 수 있다.

  • 인텔리제이에서 애플리케이션을 백그라운드 실행(또는 무중단 배포)하고 실행창에 redis-cli를 입력한다.
  • 또는 인텔리제이에서 중단 배포로 실행하고 putty에서 EC2의 IP로 접속하여 아래의 명령을 입력한다.
redis-cli -h {내 탄력적 IP} -p 6379 // {}는 입력하지 않는다.

③ 결과 확인

  • KEYS *은 모든 KEY를 조회하기 때문에 backup도 같이 보이지만, 신경 쓸 필요는 없다.
  • IntelliJ에서는 아래와 같이 보인다.

※ 토큰만 조회하기
backup이 같이 보이는게 싫다면, KEYS e* 이라고 해서 e로 시작하는 키 값만 조회할 수도 있다. 적어도 우리가 생성한 JWT는 항상 앞글자가 e이기 때문에 이러한 방식으로 조회하는 것도 가능하다.

  • 블랙리스트에 존재하는 토큰으로 요청을 보내면, 요청이 거부된다.

5. 기타 Redis CLI 명령어

① key에 해당하는 value 가져오기

  • get 키워드를 사용하면 된다.
  • 위 예제에서는 "게시글 업로드 금지" 제재를 3일 동안 받은 유저의 ID를 저장하고 있는 상태라서 value가 DISABLE_TO_UPLOAD로 설정되어 있다.
  • 이와 같이 로그아웃 뿐 아니라 유저를 특정 기간동안 제재시키는 데에도 Redis를 유용하게 사용할 수 있다.

② Redis 데이터베이스 초기화하기

  • FLUSHALL을 입력하면 된다.
  • OK라는 응답과 함께 모든 key-value 쌍이 사라진다.

③ 키의 TTL 조회하기

  • TTL은 Time To Live의 줄임말로, 컴퓨터나 네트워크에서 데이터의 유효 기간을 나타내기 위한 방법이다.
  • 즉, key-value 쌍이 Redis에 얼마만큼의 시간동안 유지될지를 의미한다.
  • TTL {key 이름} 을 사용하면 TTL을 초 단위로 반환받을 수 있고, PTTL {key 이름}을 사용하면 TTL을 밀리초 단위로 반환받을 수 있다.
  • 구글에 "초를 시간으로"를 검색하여 TTL 값을 시간으로 변환할 수도 있다. 당연히 밀리초를 시간으로 변환하는 것도 가능하다.
profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글