오늘도 자바스크립트 공부를 하다가 알게된 재미있는 사실을 하나 공유 드립니다. 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)

0 Comments

Cancel