본문 바로가기
개발 공부

[NestJS] @useGuards를 사용하여 쿠키에서 토큰 추출하기

by 부지런한 배짱이 2021. 9. 2.

@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 대신 커스텀 함수를 만들어 사용해보겠습니다.

passport 관련 문서

// 새로 만든 함수
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를 전달받아 쿠키를 확인하는 함수를 작성하여 토큰값을 추출할 수 있었습니다.