티스토리 뷰

728x90
반응형

nestjs의 dto는 우리가 별다른 노력을 들이지 않아도 입력값을 자동으로 dto 클래스에 매핑을 하여

 

손쉽게 사용할수 있도록 도와줍니다

 

export class CreateUserDto {
  username: string;
  password: string;
  email: string;
  role: string;
}

 

이러한 dto 클래스를 선언했다고 생각해봅니다

 

유저 생성시에 post body를 통해 위에 선언된 같은 이름의 변수들을 받아서  매핑을 합니다

 

그런데 만약 post body로 class에 선언되지 않은 파라메터들이 추가로 오는 경우 어떻게 될까요?

 

 

{
    "username": "hello",
    "phone": "01011112222"
}

 

이렇게 post body에 phone이라는 정의되지 않은 필드를 전달합니다

 

그리고 controller내에서 실제 전달받은 createUserDto를 바로 콘솔상에서 출력을 해보면

 

CreateUserDto { username: 'hello', phone: '01011112222' }

 

이렇게 phone값이 인스턴스내에 저장되어있는것을 알수 있습니다

 

하지만 클래스 선언에 phone을 선언하지 않았기 때문에

 

IDE상에서 타입힌트나 자동완성과같은 도움을 받을수는 없습니다

 

하지만 분명 변수와 값은 존재합니다

 

 

 

그렇기 때문에 dto를 바로 전달받아 그걸 그대로 리소스를 생성하는 경우 예상치 못한 보안 문제가 발생할수 있습니다

 

 

 

  app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      whitelist: true,
    }),
  );

 

이때 활용할수 있는 validationpipe의 whitelist 옵션이 있습니다

 

이 옵션은 기본적으로는 off 상태인데 true로 전달하는 경우 활성화가 되어

 

클래스에 선언된 변수들만 처리하고 그 외의 변수들은 버립니다

 

 

상황에 맞춰 사용하시면 참 좋겠죠?

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함