Swagger 보안설정의 이유


swagger에는 보안설정을 해주어야한다. 왜 해야하냐고? 서버의 api문서인데 아무나 볼 수 있게 하는 게 보안에 좋을리가 없기 때문이다.

기존 서버 endpoint에 /docs 를 붙이면 swagger 문서가 나오게 되는데, 이 문서에 암호를 걸어줄 필요가 있다.

Swagger 보안설정 방법


먼저 라이브러리를 설치해야한다.

npm i express-basic-auth

위 라이브러리를 이용해서 swagger를 보안설정할 것이다.

main.ts

import { HttpExceptionFilter } from 'src/common/exceptions/http-exception.filter';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
import { SwaggerModule, DocumentBuilder, OpenAPIObject } from '@nestjs/swagger';
import * as expressBasicAuth from 'express-basic-auth';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe()); // class validation 등록
  app.useGlobalFilters(new HttpExceptionFilter()); // global filter 사용
  app.use(
    ['/docs', '/docs-json'],
    expressBasicAuth({
      challenge: true,
      users: {
        [process.env.SWAGGER_USER]: process.env.SWAGGER_PASSWORD,
      },
    }),
  ); // swagger에 아무나 접근하면 안되기 때문에 암호를 걸어둔다.
  const config = new DocumentBuilder()
    .setTitle('C.I.C')
    .setDescription('cat')
    .setVersion('1.0.0')
    .build(); // swagger 설정

  const document: OpenAPIObject = SwaggerModule.createDocument(app, config); // swagger 생성
  SwaggerModule.setup('docs', app, document); // swagger 등록

  // cors error 해결
  app.enableCors({
    origin: true, // 모든 주소에서 요청을 보낼 수 있기 때문에 개발이 끝나면 url으로 작성한다.
    credentials: true,
  });

  const PORT = process.env.PORT;
  await app.listen(PORT);
}
bootstrap();
 app.use(
    ['/docs', '/docs-json'],
    expressBasicAuth({
      challenge: true,
      users: {
        [process.env.SWAGGER_USER]: process.env.SWAGGER_PASSWORD,
      },
    }),
  );

expressBasicAuth 라이브러리를 이용해서 process.env.SWAGGER_USER 로 사용자 이름을 process.env.SWAGGER_PASSWORD로 비밀번호를 설정한다.

JWT Secret 보안


jwt의 secret key도 env에 설정해서 보안해주어야 소스코드가 노출되더라도 사용자의 계정을 지킬 수 있다.