설명
공개 메서드가 호출자가 전달한 배열을 내부 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()등으로 복사해 저장하세요.