JWT를 사용할때 당연히 비밀키는 환경변수 설정으로 보안성을 지켜주는데,
//auth.module.ts
@Module({
imports: [
TypeOrmModule.forFeature([User]),
JwtModule.register({
secret: process.env.JWT_SECRET,
signOptions: { expiresIn: '300s' },
}),
PassportModule,
],
exports: [TypeOrmModule],
controllers: [AuthController],
providers: [AuthService, UserService, JwtStrategy],
})
export class AuthModule {}
위의 코드와 같이 작성했을 때 Error: secretOrPrivateKey must have a value 가 반출되었다.
지금 jwt모듈에 있는 secret:의 값이 존재하지 않는다는 것인데, 이건 내가 .env를 읽기위한 작업을 잘못하였기 때문이었다.
같은 에러에 대해서 해결방법으로 configService를 이용해 press.env객체에 접근하는것이 아니라,config.get<string>('JWT_SECRET')
으로 아래의 코드처럼 작성해서 처리하는 포스팅을 보았다
//auth.module.ts
JwtModule.registerAsync({
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
secret: config.get<string>('JWT_SECRET'),
signOptions: { expiresIn: '1d' },
}),
}),
똑같이 적용했어도 내 코드는 동작하지 않고 에러를 뿜어냈다.
굳이 어렵게 돌아갈게 아니라 그냥 process.env객체에 접근할 수 있게 해주면 되는거 아닌가? 라는 생각이 들어서 그냥 dotenv라이브러리를 설치하고 main.ts의 서버를 열기전에 dotenv.config()를 해주었지만, 또 동작하지 않았다.
//main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as dotenv from 'dotenv';
async function bootstrap() {
dotenv.config();
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
NestJS의 모듈로딩 방식에서 독립적으로 컨택스트를 가지기 때문에 연결된 모듈이 아니라면 dotenv.config()를 해주어도 process.env객체에 접근할 수 없다.
따라서 모든 모듈의 연결점이 되는 app.module.ts에 config를 임포트해서 연결된 모듈에서 process.env객체에 접근할 수 있도록 하여 해결할 수 있었다.
//app.module.ts
import { config } from 'dotenv';
config();