@useGuards를 사용하여 쿠키에서 토큰 추출하는 법을 알아보겠습니다.
NestJS는 useGuads라는 데코레이터를 제공하여 Request의 유효성검사를 합니다.
@Get()
@UseGuards(AuthGuard())
getAll() {
return this.productService.getAll();
}
AuthGuard는 passport를 NestJS의 코드 스타일로 사용하기 위해 만들어졌으며
실질적으로 passport를 상속한 Strategy클래스를 이용합니다.
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
@InjectRepository(UserRepository)
private userRepository: UserRepository
) {
super({
secretOrKey: 'test',
ignoreExpiration: false,
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
})
}
async validate(payload: any) {
return payload;
}
}
핵심은 JwtFromRequest라는 키는 Request를 전달받고
ExtractJwt가 제공하는 함수에 의해 Request에서 jwt를 추출한다는 것인데
사실 직접 Reqeust안에서 Header와 Cookie를 검사하는 코드를 직접 작성하여 사용해도 되지만
@useGuards가 존재하는 이유중 하나는 NestJS 내에서의 SRP(단일책임원칙)을 위함이며,
AuthGuard는 Passport를 맵핑한 클래스입니다.
또한 Fastify와 express를 같이 호환하는 NestJS의 특성 때문 일 수 있습니다.
문제는 쿠키에서 JWT를 추출하는 함수는 제공하지 않는다는 것인데요.
NestJS의 규칙을 따르며 쿠키를 검사하기 위해
ExtractJwt 대신 커스텀 함수를 만들어 사용해보겠습니다.
// 새로 만든 함수
let cookieExtractor = function(req) {
var token = null;
if (req && req.cookies) {
token = req.cookies['token'] || req.header;
}
return token;
};
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
@InjectRepository(UserRepository)
private userRepository: UserRepository
) {
super({
secretOrKey: 'test',
ignoreExpiration: false,
jwtFromRequest: cookieExtractor
})
}
async validate(payload: any) {
return payload;
}
}
jwtFromReqeust라는 키에서 Reqeust를 전달 받을 수 있으므로
Reqeust를 전달받아 쿠키를 확인하는 함수를 작성하여 토큰값을 추출할 수 있었습니다.
'개발 공부' 카테고리의 다른 글
원티드x위코드 프리온보딩 네번째 기업과제 (에잇퍼센트) 회고록 (0) | 2021.11.15 |
---|---|
원티드x위코드 프리온보딩 세번째 기업과제 (Red Brick) 회고록 (0) | 2021.11.11 |
원티드x위코드 프리온보딩 두번째 기업과제 (Mapia Company) 회고록 (0) | 2021.11.08 |
프리온보딩 지원 동기 (0) | 2021.11.06 |
원티드x위코드 프리온보딩 첫번째 기업과제 (AIMMO) 회고록 (0) | 2021.11.04 |