JWT사용할 때 env를 못 읽는 에러

권태형·2023년 4월 17일
0

bnb Back-Server Project

목록 보기
4/31

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();
profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글