NestJS 에서는 `@nestjs/swagger` 패키지를 통해 API Swagger docs 를 만들 수 있다.
해당 패키지에 대한 기본적인 가이드는 [공식문서] 를 참조하자.
서버에서 API 를 구현하면서 몇가지 설정을 동봉하면 Swagger 가 자동생성되는데,
이를 통해 개발된 API 에 대한 호출을, 정의한 타입들을 운용하여 실행 및 테스트해볼 수 있다.
NestJS Swagger 문서는 서버랑 같이 실행되면서 serve 되기 때문에 서버 엔드포인트의 특정 경로를 기반으로 제공된다. 그러다보니, 클라이언트 개발자나 외부 인원에게 공유하기 위해 만든 이 문서가 서버 경로를 아는 누군가에 의해 노출될 수 있는 것이다.
예를 들어, Swagger 를 "/api-docs" 라고 하는 경로 하위에 설정하였다면,
서버가 배포된 환경에서, "https://서버.예시.주소/api-docs" 와 같은 접근 가능한 상태가 될 것이기에,
서버 주소를 알게 된 누군가(혹은 공격성을 띈 누군가)에 의해 마구마구 접근될 수 있는 것이다.
그래서 API Swagger 문서(즉, 서버의 특정 경로)에 대한 접근 보안을 걸어주기로 했다.
물론 NestJS 자체에서 제공하는 `Guard` 등의 설정을 통해 API 자체에 대한 호출(실행)을 막아줄 수 는 있으나, 누군가 모르는 사람이 내가 배포해둔 서버의 Swagger 에 들어와 API 목록들을 찬찬히 구경하고 간다는 것은 여간 꺼림칙할 수 있다.
나는 보안을 위해 사용할 수 있는 쉬운 패키지 중 하나인 `exporess-basic-auth` 패키지를 채택했다.
Express 에서 특정 Route 경로에 대한 보안을 유저/비밀번호 형태로 처리할 수 있는 패키지다.
npm : express-basic-auth 에서 이 패키지를 확인할 수 있다. 더 궁금한 점이 있다면 이곳에서 제공하는 자료를 확인해보자.
# 1. `express-basic-auth` 패키지 설치
일단 당연하게도 Swagger 를 사용하고 있어야 한다. 위에 언급하였던 공식문서를 기반으로 설정하자.
설치와 설정은 간단하다.
일단 프로젝트 영역에 해당 패키지를 설치한다. 자신의 패키지매니저에 따라서 설치하자.
# NPM 이라면
npm install express-basic-auth
# YARN 이라면
yarn add express-basic-auth
# 2. 유저/비밀번호 환경변수 설정
이제 지정할 유저와 비밀번호만을 설정하면 되는데, 당연스럽게 보안을 위한 설정이므로 환경변수로부터 안전하게 가져오는게 좋다.
NestJS 에서 환경변수는 `@nestjs/config` 의 메커니즘이나 `dotenv` 등 다양한 방식으로 가져올 수 있는데, 자신의 프로젝트에 설정되어 있는 환경을 응용하여 환경변수를 설정하고 가져오면 되겠다.
# 3. 애플리케이션 설정
환경변수를 통해 유저, 비밀번호 값이 설정되었다고 가정한다면, 이제 `main.ts` 메인 실행파일을 수정하여 해당 보안을 걸어주도록 하자.
NestJS 실행파일에서는 기본적으로 아래와 같은 애플리케이션을 생성하고 실행시킨다.
(NestJS 공식 보일러플레이트에서 제공하는 코드)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
여기서 `app` 이 생성/실행되는 애플리케이션이기 때문에, 이에 대한 Swagger 설정을 해야 한다.
`app.use` 함수를 이용하여 해당 Swagger 에 주입될 경로에게 `BasicAuth` 를 걸어주면 된다.
아래에 `main.ts` 실행에 적용한 예시 코드가 있다.
코드를 살펴보면 환경변수 설정 영역과 Swagger 설정 영역으로 나뉘며, Swagger 설정에서는 보안 설정과 실제 문서 설정으로 영역이 나뉜다.
/**
* 환경변수 영역
*/
const username = 'user';
const password = 'password';
const path = 'docs';
환경변수 영역은 다양한 방법을 통해 설정할 Swagger 제공주소, 접근 유저이름, 비밀번호 설정 값을 나타낸다.
// Swagger 보안 설정
app.use(
[`/${path}`],
expressBasicAuth({
challenge: true,
users: {
[username]: password,
},
}),
);
Swagger 보안 설정 영역은 다운로드한 `express-basic-auth` 패키지의 사용법을 나타낸다. `app` 애플리케이션에 이 설정을 하게 되는데, 아래 사항들을 주의하도록 하자.
- 첫번째 인자값은 서버 애플리케이션에서 Swagger 문서가 나타나는 경로를 지정한다.
이 때, 경로 가장 앞에 `/` 값이 없다면 추가해주자. - 두번째 인자값에 설정하는 BasicAuth 보안이 들어간다.
접근하는데 허용해줄 유저-비밀번호 Pair 를 object key-value 형식으로 넘겨주면 된다.
// Swagger 설정
const config = new DocumentBuilder().build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup(path, app, document);
Swagger 설정 영역은 예시로 작성한 것이므로, 실행은 되나 구체적인 설정들이 동반되어 있지 않다.
앞서 제공한 공식문서나 `@nestjs/swagger` 패키지 사용법들을 참고하자.
이렇게 설정해준 뒤, 위 소스코드를 기반으로 서버 애플리케이션을 실행시켜보자.
그리고 3000 포트로 serve 되므로 http://localhost:3000/docs 경로로 들어가보자.
로그인에 성공하면 Swagger 문서에 접근할 수 있게 된다.
'개발자 💻 > NestJS' 카테고리의 다른 글
[초보자의 눈으로 보는 NestJS] 6. DTO와 Validation (0) | 2024.05.31 |
---|---|
class-validator 의 @IsBoolean 데코레이터와 enableImplicitConversion 설정된 Transform 의 문제 (0) | 2024.02.29 |
[초보자의 눈으로 보는 NestJS] 5. 유저 서비스의 구현 (0) | 2024.02.24 |
[초보자의 눈으로 보는 NestJS] 4. 유저 서비스의 정의와 의존성 주입 (1) | 2023.11.13 |
[초보자의 눈으로 보는 NestJS] 3+. API 테스트를 위한 Postman (0) | 2023.07.19 |