redis로 session 인증 구현해보기

nogie·2022년 4월 12일
0
post-thumbnail
post-custom-banner

현재 express로 crud restAPI를 만들던 도중 로그인을 한 이용자만 사용할 수 있게끔 하기 위해 session 인증을 추가하기로 했다. 간단하게 하려면 바로 express-session을 이용하면 되지만 redis도 공부하고 있겠다 직접 연동하여 사용해볼 겸 인증시스템을 구현해봤다.

session 구현을 위해 필요한 목록으로 다음과 같이 뽑아봤다.

a. 로그인 시 랜덤 문자열을 만들어 redis에 key 등록 (만료 시간 30분)
b. session을 검증해줄 user 객체 생성
c. 로그인과 동시에 key 등록 후 cookie에 session 값 등록
d. 인증이 필요한 각 페이지 별로 auth checking

1. redis에 값 넣기

일단 key를 등록할 수 있도록 코드를 대충 짜보자

const redis=require('redis')
const client=redis.createClient()

async function run(){
    await client.connect()
}

run()

module.exports={
    setValue:async function(key,value){
        const onehourExpire=60*60
        await client.set(key,value,"EX",onehourExpire);
    },

    getValue:async function(key){
        return client.get(key)
    },

    existKeyChecker:async function(key){
        return client.exists(key)
    },

    //expireKey:async function(key){
        //await client.del(key)
    //}
}

다른 코드에서 뽑아쓸 수 있도록 module 화 해놓았다.

const redisControl=require('../db/redis_test')

redisControl.setValue("key","tost")
//대충 async 함수 있다고 가정
const exampleKey=await redisControl.getValue("key")
const judg=await redisControl.existKeyChecker("key")

대략적으로 이렇게 사용하면 된다.


이제 로그인 성공 시 redis에 sessionKey가 등록될 수 있게 됬다.

setValue의 test는 아주 간단하게 랜덤 문자열을 뽑아낸 값을 담아둔 변수이고 value를 의미없는 문자열로 둔 이유는 session을 검증할 때 existKeyChecker에 key값을 넣어 존재하는지 여부만을 알면 되기 때문이다.


2. session 검증을 위한 객체 생성

간단하게 기능만 구현해본거라 별거없다.

module.exports={
    userSession: function (judge){
        this.sessionAuth=judge
        this.changeToTrue=function(){
            this.sessionAuth=true
        }
        this.changeToFalse=function(){
            this.sessionAuth=false
        }
    }
}
const session=require('../pending/session_test')

const user =new session.userSession("false") //default 값은 false로 줌

user.sessionAuth //이 값을 통해 검증함
user.changeToTrue() //이 함수를 통해 세션이 존재하면 sessionAuth의 값을 true로 변경함
user.changeToFalse() //false로 변경



3. cookie에 session 값 등록

이 부분은 1. redis에 값 넣기 항목의 사진에 나와있다.



4. 인증 코드 추가


board의 list를 뽑아오는 부분에 인증을 요구하도록 했다.
세션이 존재하지 않을 경우 튕겨버리도록.



5. 증명의 시간

기존에 만들어놓은 crud api에 인증을 추가하기 위해 세션이 존재하지 않으면
unauthorized user 를 띄워 이용할 수 없도록 했다.

이제 로그인을 하고

쿠키에 session 발급 받고

board list를 뽑아보면

뙇!!




후기

사실 그냥 빨리 구현해보는데에만 집중하여 빠진 부분이 상당히 많다. 예를 들어 로그인 시 session 존재 여부를 확인하지 않고 무작정 생성만 하여 redis에 key들이 지워지지 않고 쌓이는 부분도 있고, 코드가 더러워서 제대로 사용할거면 리팩토링도 필요하고.. 의미를 완성도에 두진 말자. 일단 자고 일어나서 express-session 관련 자료를 찾아봐야겠다.

물론 이 부분은 로그아웃 기능을 추가하면 해결되는 문제이긴 하다.
로그아웃과 동시에 key를 삭제해버리면 되니까..

profile
Dev Space
post-custom-banner

0개의 댓글