swagger에는 보안설정을 해주어야한다. 왜 해야하냐고? 서버의 api문서인데 아무나 볼 수 있게 하는 게 보안에 좋을리가 없기 때문이다.
기존 서버 endpoint에 /docs
를 붙이면 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 key도 env
에 설정해서 보안해주어야 소스코드가 노출되더라도 사용자의 계정을 지킬 수 있다.