codestates / codestates/SoundBubble
[Dev_Log] 8/18 (수) 김재우
- Dominant language
- TypeScript
- Stars
- 3
- Forks
- 2
- PR merge metrics
- No merged PRs in 30d
Description
### 오늘은 어떻게 프로젝트에 기여했나요?
* 서버 토큰 블랙리스트 구현
사용자가 로그아웃을 해서 액세스 토큰을 클라이언트에서 지워도, 해당 토큰은 유효기간이 지나기 전까지 사용할 수 있다. JWT 토큰은 강제로 파기할 수 있는 방법이 없어서 블랙리스트를 이용하는 방법을 많이 사용한다고 한다.
AWS ElastiCache에서 Redis를 생성하여 토큰 블랙리스트를 구현하였다. 사용자가 로그아웃을 하면 사용하던 액세스 토큰을 해당 사용자의 id를 key, 사용자의 만료된 토큰들의 배열을 직렬화시킨 것을 값으로 하여 저장한다. 이후 사용자 인증 과정에서 해당 블랙리스트에 토큰이 있는지 검사하는 부분을 추가하여 이전 토큰들을 다시 사용되는 것을 방지했다.
### 오늘의 프로젝트에서 배운 점은 무엇인가요?
* Redis 사용 방법
Redis는 인-메모리 키 값 데이터 구조 스토어다. Strings, Lists, Sets, Hashes 등 값으로 다양한 자료구조를 사용할 수 있으며 손쉽고 빠르게 저장하거나 불러올 수 있다.
ElastiCache에 생성한 Redis의 주소(host)를 redis 패키지에 입력하여 배포 환경에서 연결한다. 이후에 set, get 메소드를 사용할 수 있다. Redis는 인자로 콜백함수를 받는 방법을 이용해 비동기적으로 동작한다. 하지만 Node에서 제공하는 util.promisify를 사용하면 Promise 기반의 비동기, async/await 키워드까지 사용할 수 있다.
```js
// Redis 연결
export const redisClient = redis.createClient(redisPort, redisHost);
// 사용할 메소드 프로미스화
export const setexAsync = promisify(redisClient.setex).bind(redisClient);
export const getAsync = promisify(redisClient.get).bind(redisClient);
// 토큰 블랙리스트 등록
await setexAsync(String(userId), tokenExpIn, JSON.stringify(blackList));
// 토큰 블랙리스트 조회
const data = await getAsync(String(userId));
if (data) {
const parsedList = JSON.parse(data);
if (parsedList.includes(currentToken)) {
// 블랙리스트에 등록된 토큰
}
}
```
### 내일은 프로젝트에 기여하기 위해 무엇을 해야 하나요?
* [ ] HTTPS 배포 적용
* [ ] 클라이언트 로그아웃 요청 추가
* [ ] 서버 로그 추가
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.