오늘도 자바스크립트 공부를 하다가 알게된 재미있는 사실을 하나 공유드린다. Why does Google prepend while(1); to their JSON responses?라는 글을 읽다 보니 다음과 같은 JSON 코드가 눈에 보였다.
잠깐 JSON 결과에 생뚱맞게 while(1);을 붙이는 이유를 생각해보자. 당장 떠오르는 대답은 eval()로 JSON 결과를 해석하는 과정에서 엉뚱한 문제가 생길 가능성이다. 하지만 다른 가능성은 없을까?
스택오버플로우 대답을 읽어보니 흥미로운 시나리오가 존재했다. 다들 잘 알고 계시겠지만, 기본적으로 CORS(Cross Origin Resource Sharing) 방어 덕분에 외부에서 가져온 리소스에서 내부 데이터에 접근할 방법은 없다. 하지만 JSON 컨텐츠를 요청하기 위해 script 태그를 사용할 때, 외부 공격자의 코드 내부에서 JSON을 자바스크립트처럼 실행할 수 있는 문제가 있다(ES5까지 지원하는 대다수 브라우저). 따라서, 공격자는 객체 생성 과정에서 사용될 배열이나 객체 생성자나 다른 메소드를 슬쩍 바꿔서 JSON으로 넘어오는 데이터를 가로채는 방법으로 손쉽게 중요한 정보를 얻을 수 있다. 일례로 JSON 데이터가 gmail에서 가져온 25개 이메일 정보라고 생각해보라!
자, 그러면 올바른 프로그래밍 기법은 무엇일까? 다음과 같은 세 가지 사항을 염두에 두기 바란다.
- JSON이 결코 실행 가능한 형태가 되지 않게 만든다
- JSON이 결코 유효한 자바스크립트가 되지 않게 만든다
- 주의: 유효한 JSON이지만 유효하지 않은 자바스크립트가 되게 만든다(참고: AJAX Security Cheat Sheet)
결론: 열 명이 도둑 한 명 못 막는다는 말이 있듯이 보안은 늘 어렵다. 항상 주의에 주의를 거듭하자.
EOB
댓글 없음:
댓글 쓰기