Skip to content

Commit e4c8c5d

Browse files
feat: 로그아웃 시 db refreshToken 비우기
1 parent 65d00bc commit e4c8c5d

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

apps/backend/src/auth/auth.controller.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,11 @@ export class AuthController {
8484
@ApiOperation({ summary: '사용자가 로그아웃합니다.' })
8585
@Post('logout')
8686
@UseGuards(JwtAuthGuard) // JWT 인증 검사
87-
logout(@Res() res: Response) {
87+
logout(@Req() req, @Res() res: Response) {
8888
// 쿠키 삭제 (옵션이 일치해야 삭제됨)
8989
this.tokenService.clearCookies(res);
90+
// 현재 자동로그인에 사용되는 refresh Token db에서 삭제
91+
this.tokenService.deleteRefreshToken(req.user.sub);
9092
return res.status(200).json({
9193
message: AuthResponseMessage.AUTH_LOGGED_OUT,
9294
});

apps/backend/src/auth/token/token.service.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export class TokenService {
2626
}
2727

2828
async generateRefreshToken(userId: number): Promise<string> {
29+
// 보안성을 높이기 위해 랜덤한 tokenId인 jti를 생성한다
2930
const payload = { sub: userId, jti: uuidv4() };
3031
const refreshToken = this.jwtService.sign(payload, {
3132
expiresIn: FIVE_MONTHS,
@@ -52,14 +53,15 @@ export class TokenService {
5253
}
5354

5455
async refreshAccessToken(refreshToken: string): Promise<string> {
55-
// refreshToken 1차 검증한다
56+
// refreshToken 1차 검증
5657
const decoded = this.jwtService.verify(refreshToken, {
5758
secret: process.env.JWT_SECRET,
5859
});
5960

6061
// 검증된 토큰에서 사용자 ID 추출
6162
const userId = decoded.sub;
6263

64+
// refreshToken 2차 검증
6365
// DB에 저장된 refreshToken과 비교
6466
const isValid = await this.compareStoredRefreshToken(userId, refreshToken);
6567
if (!isValid) {
@@ -132,4 +134,18 @@ export class TokenService {
132134
user.refreshToken = refreshToken;
133135
await this.userRepository.save(user);
134136
}
137+
138+
async deleteRefreshToken(id: number) {
139+
// 유저를 찾는다.
140+
const user = await this.userRepository.findOneBy({ id });
141+
142+
// 유저가 없으면 오류
143+
if (!user) {
144+
throw new UserNotFoundException();
145+
}
146+
147+
// 유저의 현재 REFRESH TOKEN 삭제
148+
user.refreshToken = null;
149+
await this.userRepository.save(user);
150+
}
135151
}

0 commit comments

Comments
 (0)