Skip to content

[준섭] 1122(수) 개발기록 ‐ SignOut시 토큰 제거

송준섭 edited this page Nov 22, 2023 · 3 revisions

회원이 signout을 시도한다면 하면 다음과 같은 과정이 일어나야 한다.

  1. 브라우저 쿠키의 토큰을 검사하여 로그인 한 사용자인지 확인 → 아니라면 Unauthorized 에러
  2. 로그인 한 사용자라면 Redis에서 해당 로그인 정보를 삭제하고 브라우저 쿠키 삭제

이 중 1번 단계 브라우저 쿠키 토큰을 검사하는 것은 미리 만들어 놓은 CookieAuthGuard를 이용해 진행

RedisRepository에 del 메소드 추가

// auth/redis.repository.ts
import ...

@Injectable()
export class RedisRepository {
	
	// 생략 ..

	async del(key: string) {
		return this.redisClient.del(key);
	}
	
	// 생략 ..

}

Redis에 해당 키로 저장된 데이터를 삭제해주는 del 메소드

AuthService에 signoOut 메소드 추가

// auth/auth.service.ts
async signOut(user: Partial<User>) {
	this.redisRepository.del(user.username);
}

user 정보를 받아 redisRepository의 del 메소드를 실행하는 signOut 메소드

AuthController에 signout api 구현

// auth/auth.controller.ts
@Get('signout')
@UseGuards(CookieAuthGuard)
@ApiOperation({ summary: '로그아웃', description: '로그아웃을 진행합니다.' })
@ApiOkResponse({ status: 200, description: '로그아웃 성공' })
async signOut(@Res({ passthrough: true }) res: Response, @Req() req) {
	await this.authService.signOut(req.user);
	res.clearCookie(JwtEnum.ACCESS_TOKEN_COOKIE_NAME, {
		path: '/',
		httpOnly: true,
	});
	res.clearCookie(JwtEnum.REFRESH_TOKEN_COOKIE_NAME, {
		path: '/',
		httpOnly: true,
	});
	return { message: UserEnum.SUCCESS_SIGNOUT_MESSAGE };
}

@UseGuard(CookieAuthGuard)로 일단 들어오는 요청에 대하여 쿠키를 검사해 로그인 한 유저인지 확인하고, Req 객체에 user라는 속성으로 로그인한 user의 정보를 넣어준다.

req.user를 AuthService에 넘겨 Redis의 토큰 정보를 삭제한다.

res.clearCookie로 브라우저 accessToken, refreshToken 쿠키를 삭제한다.

동작 화면

로그인 하지 않은 경우 (쿠키에 토큰이 없거나 유효하지 않은 경우)

image

로그인 한 경우 (쿠키의 토큰이 유효한 경우)

image

소개

규칙

학습 기록

[공통] 개발 기록

[재하] 개발 기록

[준섭] 개발 기록

회의록

스크럼 기록

팀 회고

개인 회고

멘토링 일지

Clone this wiki locally