해결된 질문
작성
·
49
·
수정됨
1
37강 (모든 Route 기본 Private로 만들고 IsPublic Annotation 작업하기) 강의 에서
8분 50초에
아래의 코드에 @IsPublic을 해줘도 아래 가드를 통과해야 해서 괜찮다고 말씀해주셨는데요.
//access 토큰 재발급
@Post('token/access')
@IsPublic() // 여기가 퍼블릭이여도 밑에서 가드를 통과해야하기 때문에 괜찮다.
@UseGuards(RefreshTokenGuard)
postTokenAccess(@Headers('authorization') rawToken: string) {
// 여기서 받는 rawToken은 Bearer 이다.
const token = this.authService.extractTokenFromHeader(rawToken, true);
// token은 refresh 토큰이다. false를 같이 던져줘서 acess 토큰이 나온다.
const newToken = this.authService.rotateToken(token, false);
/**
* {accessToken: {token}} 이러한 형태로 리턴
*/
return { accessToken: newToken };
}
//refresh 토큰 재발급
@Post('token/refresh')
@IsPublic()
@UseGuards(RefreshTokenGuard)
postTokenRefresh(@Headers('authorization') rawToken: string) {
// 여기서 받는 rawToken은 Bearer 이다.
const token = this.authService.extractTokenFromHeader(rawToken, true);
// token은 refresh 토큰이다. true를 같이 던져줘서 acess 토큰이 나온다.
const newToken = this.authService.rotateToken(token, true);
/**
* {refreshToken: {token}} 이러한 형태로 리턴
*/
return { refreshToken: newToken };
}
AccessTokenGuard, RefreshTokenGuard 모두 BearerTokenGuard를 먼저 수행하기 때문에 req에 IsRoutePublic가 true로 되어 있어서 AccessTokenGuard, RefreshTokenGuard 이 두 개 모두 바로 통과하는 것으로 알고 있습니다.
이렇게 되면 IsPublic 어노테이션을 사용한 상황에서는 전역으로 설정된 AccessTokenGuard는 통과하게 됩니다. 그리고 "token/access" API에 설정된 RefreshTokenGuard도 물론 통과하게 됩니다.
이렇게 되면 RefreshTokenGuard는 어디에서도 사용할 수 없는 게 아닐까요??
///////////////정리////////////////////////////////
% 토큰 재 발급하는 상황이라고 가정 %
IsPublic 어노테이션 설정됨 -> AccessToken 통과, RefreshTokenGuard 통과
BearerTokenGuard 통과
RefreshTokenGuard도 통과
즉, refreshToken 인지 검증 불가능
IsPublic 어노테이션 설정됨 -> AccessToken 검증
재검증 로직이므로 refresh 토큰을 보냈으므로 AccessToken 검증에서 accessToken이 아니라고 걸림
즉, RefreshTokenGuard는 사용할 수 없게 되는게 아닌가요?
답변 2
1
안녕하세요!
말씀하신 부분 public과 동시에 적용할 경우 역설적일 수 있습니다.
하지만 extract를 진행할때 prefix를 확인하고 있는 상황이기에 문제 없습니다.
RefreshTokenGuard를 사용 해야하는 상황이 RefreshToken을 요구하는 상황인데 RefreshToken은 사실상 AccessToken 재발급 할때만 필요하기 때문에 RefreshTokenGuard의 경우 필요없게 되는게 맞습니다.
감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다. Full Stack 개발자님.
질문하신 내용은 @IsPublic
어노테이션과 Guard의 작동 방식에 대한 부분이군요. 이와 관련하여 기존에 주어진 답변 및 논의를 참고하시면 도움이 될 것 같습니다.
IsPublic
어노테이션과 Guard의 상호작용, 특히 RefreshTokenGuard에 대한 적용이 이루어지지 않을 때의 문제점에 대해 논의하고 있습니다. 질문하신 경우와 매우 유사하게, 특정 엔드포인트에서 Guard가 무시될 수 있는 상황에 대해 설명하고 있습니다.위 링크에서 설명되고 있는 바와 같이, @IsPublic
어노테이션이 적용된 경우에는 해당 라우트에서 Guard가 무력화될 수 있습니다. 이는 Guard의 순서와 표현 방식에 따라 다르게 작용할 수 있으며, 특히 라우트가 Public으로 설정되면 Guard가 스킵되는 구조가 흔히 사용됩니다. 따라서 Guard가 작동하지 않고 바로 리턴되는 현상이 발생할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.