현재 express로 crud restAPI를 만들던 도중 로그인을 한 이용자만 사용할 수 있게끔 하기 위해 session 인증을 추가하기로 했다. 간단하게 하려면 바로 express-session을 이용하면 되지만 redis도 공부하고 있겠다 직접 연동하여 사용해볼 겸 인증시스템을 구현해봤다.
session 구현을 위해 필요한 목록으로 다음과 같이 뽑아봤다.
a. 로그인 시 랜덤 문자열을 만들어 redis에 key 등록 (만료 시간 30분)
b. session을 검증해줄 user 객체 생성
c. 로그인과 동시에 key 등록 후 cookie에 session 값 등록
d. 인증이 필요한 각 페이지 별로 auth checking
일단 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값을 넣어 존재하는지 여부만을 알면 되기 때문이다.
간단하게 기능만 구현해본거라 별거없다.
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로 변경
이 부분은 1. redis에 값 넣기 항목의 사진에 나와있다.
board의 list를 뽑아오는 부분에 인증을 요구하도록 했다.
세션이 존재하지 않을 경우 튕겨버리도록.
기존에 만들어놓은 crud api에 인증을 추가하기 위해 세션이 존재하지 않으면
unauthorized user 를 띄워 이용할 수 없도록 했다.
이제 로그인을 하고
쿠키에 session 발급 받고
board list를 뽑아보면
사실 그냥 빨리 구현해보는데에만 집중하여 빠진 부분이 상당히 많다. 예를 들어 로그인 시 session 존재 여부를 확인하지 않고 무작정 생성만 하여 redis에 key들이 지워지지 않고 쌓이는 부분도 있고, 코드가 더러워서 제대로 사용할거면 리팩토링도 필요하고.. 의미를 완성도에 두진 말자. 일단 자고 일어나서 express-session 관련 자료를 찾아봐야겠다.
물론 이 부분은 로그아웃 기능을 추가하면 해결되는 문제이긴 하다.
로그아웃과 동시에 key를 삭제해버리면 되니까..