Private 배열에 외부 배열 참조 직접 할당

Private 배열에 외부 배열 참조 직접 할당

설명

공개 메서드가 호출자가 전달한 배열을 내부 private 필드에 그대로 저장하면 호출자가 메서드 호출 후 원본 객체를 수정해 내부 상태를 바꿀 수 있습니다.

잠재적 영향

  • 권한 목록이나 정책 목록 검증을 우회할 수 있습니다.
  • 객체의 불변 조건이 외부 참조 변경으로 깨질 수 있습니다.

해결 방법

  • 외부에서 받은 배열은 스프레드, Array.from(), slice() 등으로 복사해 저장하세요.
  • 저장 전 요소 타입과 허용 값을 검증하세요.
  • 얕은 복사는 중첩 객체의 참조를 유지합니다. 변경 가능한 요소는 필요한 깊이까지 복사하거나 불변 값으로 저장하세요.

예시

변경 전

javascript
class AccessPolicy {
  #roles = [];

  setRoles(roles) {
    this.#roles = roles;
  }
}

변경 후

javascript
class AccessPolicy {
  #roles = [];

  setRoles(roles) {
    this.#roles = [...roles];
  }
}

설명:

  • 변경 전: 공개 메서드가 호출자가 전달한 배열을 내부 private 필드에 그대로 저장하면 호출자가 메서드 호출 후 원본 객체를 수정해 내부 상태를 바꿀 수 있습니다.
  • 변경 후: 외부에서 받은 배열은 스프레드, Array.from(), slice() 등으로 복사해 저장하세요.

참조