피드로 돌아가기
Dev.toBackend
원문 읽기
Go 캡슐화 위반 10건 해결을 통한 상태 오염 원천 차단
Your Go Structs Are Leaking: 6 Encapsulation Fixes From a Security CLI
AI 요약
Context
Go 언어의 Exported/Unexported 구분 방식만으로는 내부 상태 보호에 한계가 있음. 내부 Slice나 Map의 참조 주소를 그대로 반환하여 외부 호출자가 Struct 내부 데이터를 의도치 않게 변경하는 Silent Corruption 문제 발생.
Technical Solution
- slices.Clone 및 maps.Clone 도입을 통한 Backing Array 복제 및 호출자 간 메모리 격리 구현
- 내부 요소 반환 시 포인터(*Asset) 대신 Value(Asset) 반환 및 comma-ok 패턴 적용으로 직접 수정 경로 제거
- 읽기 전용 메서드의 Receiver를 Pointer에서 Value로 변경하여 불변성(Immutability) 명시 및 상태 변경 가능성 차단
- 생성자(Constructor) 진입 시 입력받은 Slice를 즉시 복제하여 생성 후 외부에서의 원본 데이터 변경 영향 제거
- 패키지 수준의 공유 가변 상태(Shared Mutable State)를 함수 기반 캡슐화 구조로 전환하여 접근 제어 강화
- Lazy Initialization 보호를 위해 필드를 Unexport하고 sync.Once 기반의 Accessor 메서드로 캡슐화
실천 포인트
- 내부 Slice/Map 반환 시 slices.Clone/maps.Clone 적용 여부 검토 - 읽기 전용 메서드에 불필요한 Pointer Receiver 사용 여부 확인 - Struct 내부 요소 반환 시 포인터 대신 Value 복사본 반환 고려 - 생성자에서 외부 입력 Slice를 그대로 할당하는지 확인 후 복제 로직 추가