설명
공개 메서드가 내부 private 배열을 그대로 반환하면 호출자가 반환된 참조를 통해 객체 내부 상태를 직접 변경할 수 있습니다.
잠재적 영향
- 권한 목록, 정책 목록, 검증된 값 목록이 외부 코드에 의해 변경될 수 있습니다.
- 객체의 불변 조건이 우회될 수 있습니다.
해결 방법
- 내부 배열은 스프레드,
slice(),Array.from()등으로 복사해 반환하세요. - 외부 수정이 불필요한 값은 불변 자료 구조로 노출하세요.
- 얕은 복사는 중첩 객체까지 분리하지 않습니다. 요소가 변경 가능한 객체라면 필요한 깊이까지 복사하거나 불변 값으로 만드세요.
예시
변경 전
javascript
class AccessPolicy {
#roles = [];
getRoles() {
return this.#roles;
}
}
변경 후
javascript
class AccessPolicy {
#roles = [];
getRoles() {
return [...this.#roles];
}
}
설명:
- 변경 전: 공개 메서드가 내부 private 배열을 그대로 반환하면 호출자가 반환된 참조를 통해 객체 내부 상태를 직접 변경할 수 있습니다.
- 변경 후: 내부 배열은 스프레드,
slice(),Array.from()등으로 복사해 반환하세요.