NestJS에서 권한을 세분화하여 관리하는 과정에서 multipart/form-data 형식의 요청을 처리하는 데 문제가 발생했습니다. 이 글에서는 해당 문제를 해결한 과정을 정리해보았습니다.
저희 애플리케이션은 다음과 같이 각 기능마다 다른 권한을 요구합니다.
이처럼 기능별로 권한이 다르기 때문에, 요청마다 권한을 검증하는 과정이 필요했습니다.
처음에는 일반 유저만 가드를 적용하고, 커뮤니티 유저와 관련된 권한은 서비스 레이어에서 검사했습니다. 그러나 이 방식은 코드 중복을 유발했고, 권한이 없는 사용자가 서비스 로직까지 도달하여 보안 이슈가 발생할 가능성이 있었습니다.
이러한 문제를 해결하기 위해 NestJS의 Guard 기능을 활용했습니다. Guard는 NestJS에서 제공하는 공식적인 인증 및 권한 관리 기능이고, AuthGuard와 함께 사용하면 사용자 인증을 쉽게 처리할 수 있다고 생각했습니다.

➡ 결론: Guard를 활용하여 서비스 로직을 간결하게 유지하면서 보안과 성능을 개선하고, 유지보수성을 향상시킬 수 있었습니다.
Guard를 적용하는 과정에서 또 다른 문제가 발생했습니다.
multipart/form-data 요청 처리 이슈게시글을 등록하는 API에서는 JSON 형식의 게시글 정보와 함께 이미지 파일을 업로드할 수 있도록 multipart/form-data를 사용하고 있습니다.
하지만, Guard에서 multipart/form-data 형식의 request.body 값을 읽을 수 없는 문제가 발생했습니다.
multipart/form-data 요청은 파일 인터셉터를 사용해 파일 업로드가 완료된 후 request.files와 request.body로 분리됩니다. 이 분리 시점이 Guard보다 늦게 실행되어 request.body를 찾을 수 없었던 것 입니다.
이 문제를 해결하기 위해 Guard 이전 단계에서 실행되는 미들웨어를 활용했습니다.

files와 body가 분리됨body 값을 받아와 유저 권한 확인이 방법을 통해 Guard에서도 request.body 값을 정상적으로 확인할 수 있었습니다.
이번 해결 방법은 완벽하지 않지만, NestJS의 라이프사이클을 고려하여 Guard와 multipart/form-data 요청을 함께 사용하는 방법을 고민해본 사례로 기록하고자 합니다.
혹시 같은 문제를 겪고 계신 분들에게 도움이 되었으면 좋겠습니다. 😊