* 의사코드
- accesstoken을 header > authorization에 함께 보내야함
- 이를 바탕으로 사용자 구분
- 쓰다가 만료되면 refresh token으로 access token 재발급
- refresh token도 만료되면 refresh token 재발급
- access token으로는 절대 재발급 불가 (예외처리)
* 구현
- 서비스
/**
* 토큰 검증
* @param token
*/
verifyToken(token: string){
return this.jwtService.verify(token, {
secret: JWT_SECRET,
});
}
/**
* refresh 토큰 => access 토큰 재발급
* @param token
*/
rotateToken(token: string, isRefreshToken: boolean){
const decoded = this.jwtService.verify(token,{
secret:JWT_SECRET,
});
/**
* sub : id
* email
* type : access | refresh
*/
if(decoded.type !== 'refresh'){
throw new UnauthorizedException('토큰 재발급은 Refresh 토큰으로만 가능합니다!')
}
return this.signToken({
...decoded,
}, isRefreshToken);
}
- 컨트롤러
@Post('token/access')
postTokenAccess(
@Headers('authorization') rawToken: string,){
const token = this.authService.extractTokenFromHeader(rawToken, true);
const newToken = this.authService.rotateToken(token,false);
/**
* {accessToken : {token}}
*/
return {
accessToken: newToken,
}
}
@Post('token/refresh')
postTokenRefresh(
@Headers('authorization') rawToken: string,){
const token = this.authService.extractTokenFromHeader(rawToken, true);
const newToken = this.authService.rotateToken(token,true);
/**
* {refreshToken : {token}}
*/
return {
refreshToken: newToken,
}
}
* 테스트
'JS > Nest.js' 카테고리의 다른 글
[Nest] Guard => req에 user 넣기, 로그인 과정 복습, 토큰 타입확인 (0) | 2024.09.20 |
---|---|
[Nest] 커스텀 파이프 => 비밀번호 길이 제한 구현 (0) | 2024.09.20 |
[Nest] base64 토큰 인증 구현 (0) | 2024.09.18 |
[Nest] JWT 토큰발급 구현, 외부 모듈 import-export 하는법 (0) | 2024.09.18 |
[Nest] Relation 생성, 1대다, 다대1 연관관계 구현 (0) | 2024.09.18 |