클라이언트가 요청을 보낼때 서버에서jwt 토큰을 만들어서 응답시에 jwt토큰을 http header에 실어서 보내줍니다. 이때 브라우져가 이 토큰을 가지고 있다가 클라이언트에게 인증이나 권한이 필요한 요청이 오면 http header에 있는 jwt토큰을 서버의 토큰과 비교해서 인가된 대상에게만 응답을 해주는 것이 jwt사용방식입니다.
npm install @types/passport-jwt --save
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy){
constructor(
@InjectRepository(UserRepository)
private userRepository: UserRepository
){
super({
secretOrKey: 'Secret1234',
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()//해더에 토큰을 베어러방식으로인증
})
}
async validate(payload){
const {username} = payload;// 페이로드안에 있는
const user: User = await this.userRepository.findOne({username});//유저정보체크
if(!user){
throw new UnauthorizedException();
}
return user;
}
}
providers: [JwtStrategy],
exports: [JwtStrategy, PassportModule]
-UseGuards안에 @nestjs/passport에서 가져온 AuthGuard()를 이용하면 요청안에 유저 정보를 넣어줄수 있습니다.
@Post('/test')
@UseGuards(AuthGuard())
test(@Req() req) {
console.log('req', req);
}
요청결과
만약에 베어러토큰이 값이 값이다르거나 없어서 인증이되지않으면 응답되지 않는다.