Object.prototype의 주의점

JavaScript, Development

만약 어떤 봇을 만든다고 생각을 해보자. users[userName]이 있으면 등록된 유저라고 판단하는 로직이 들어있으면 겉으로 봤을 때에는 아무런 문제가 없어보인다.

하지만, 만약 클라이언트 측에서 userName으로 __proto__ 라는 값을 줬다고 한다면? 굳이 __proto__ 가 아니라 Object.prototype 에 등록된 아무런 키라도 좋다. 해당 값은 이미 정의가 돼있기 때문에 falsy로 취급되지 않으며, 따라서 없는 유저임에도 있는 유저로 취급될 수 있다. 심지어 __proto__ 라는 이름을 썼다면, 프로토타입을 오염시킬 수도 있을 듯 하다.

지금까지 저런 형태의 코드를 굉장히 많이 사용한 듯 해 많이 걱정되었다. (다행히 내가 만든 서비스를 많이 문닫았기 때문에 영향이 클 듯 하진 않다.) 다음부터라도 저런 부분을 신경써서 짜야겠다.

해결방안은 굉장히 많은데, hasOwnProperty를 사용하는 방법도 있고 users[userName] 예시에서는 저게 진짜 유저타입인지 체크해보는 방법도 있다. 그 외에도 ES6 에 추가된 Map 을 사용하는 것도 좋은 방안이 될 수 있을 듯 하다.

아무튼 별 의식을 안하고 많이 쓴 패턴이라 굉장히 충격을 많이 받았다.