브라우저 해킹 vs 보안 독자 증정 이벤트 결과 발표

류광, 2014/11/11 18:18
브라우저 해킹 vs 보안 독자 증정 이벤트 문제 해설.

브라우저 해킹 vs 보안 독자 증정 이벤트를 이 시점에서 마감합니다. 답을 보내 주신 분이 두 분 밖에 없어서 자동으로 두 분이 대상자로 선정되었습니다. 두 분께는 따로 편지 드리겠습니다.

문제가 좀 어려웠나요? 본질적으로 어려운 문제는 아니지만 아마 이쪽에 관심이 없는 분에게는 이런 북마클릿의 의도 자체가 생소하지 않았나 합니다.

문제는 다음과 같았습니다.

[인용]

문제: 다음은 현재 서핑 중인 웹 페이지를 GpgStudy 게임 개발 소식의 사용자 임시 보관함에 등록하는 북마클릿입니다(원래는 한 줄인데 너무 길어서 줄을 좀 바꾸었습니다. 이 점이 답에 영향을 미치지는 않습니다). 이 코드에서 setTimeout(function ... 3000) 부분은 어떤 의미일까요?

javascript:(function(){var d=document;var s=d.createElement('script');
s.type='text/javascript';s.charset='UTF-8';
var h=encodeURIComponent(d.location.href);
s.src='http://gpgstudy.com/news/js/draft?u='+h;d.documentElement.appendChild(s);
setTimeout(function(){if(typeof gnd_added_=="undefined")
location.href='http://gpgstudy.com/news/add/draft?u='+h},3000)})()

해당 호출이 무슨 일을 하는지, 왜 그런 일이 필요한지 서술하시면 됩니다. 힌트: 짐작하셨겠지만 브라우저의 보안 기능과 관련이 있습니다.

채점 기준은 다음과 같습니다.

  • 북마클릿의 전체적인 목적은 현재 페이지 안에 결과를 표시하려는 것임을 언급 : +10점
  • setTimeout(...) 부분은 외부 JavaScript 코드의 적재가 실패하는 경우를 대비하는 것임을 언급: +10점
  • 적재 실패 이유 언급
    • https 페이지 안에서 http 자원을 적재하려 하면 적재가 실패할 수 있음을 언급: +10점
    • 현재 페이지의 Content Security Policy 설정 때문에 적재가 실패할 수 있음을 언급: +10점
      • Content Security Policy를 번역서에 쓰인 용어인 '내용 보안 정책'이라고 표현: +5점
  • setTimeout과 전역 변수를 이용한 방법 이외의 적재 실패 판정 방법 제안: +15점

추가로 설명하자면...

이 북마클릿의 전체적인 목적은 "현재 페이지를 GpgStudy 게임 개발 소식의 사용자 임시 보관함에 추가하되, 그 결과를 현재 페이지 안에 표시한다"는 것입니다. 간단한 북마클릿은 그냥 해당 URL(javascript: ... ) 안의 코드로 모든 일을 수행하지만, 이처럼 페이지 안에 새로운 HTML 요소를 추가하는 등의 좀 더 복잡한 작업을 수행하는 북마클릿은 현재 페이지 안에 동적으로 <script> 태그를 생성해서 외부 JavaScript 코드를 적재하는 방법을 사용합니다. 지금 예에서 setTimeout 호출 이전의 부분이 바로 그것으로, http://gpgstudy.com/news/js/draft?u={현재 페이지 URL}에 있는 JavaScript 코드를 가져옵니다. 그 JavaScript 코드는 임시 보관한 추가 성공 여부를 현재 페이지 안에 적절히 표시하고요.

그런데 웹사이트 또는 개별 웹페이지에 따라서는 현재 페이지 안에 외부 JavaScript 코드를 적재하지 못하는 경우가 있습니다. setTimeout 호출 부분은 그런 경우를 위한 대비책입니다. 앞에서 말한 외부 JavaScript 코드는 gnd_added_라는 변수를 정의하는데, 만일 3초가 지나도 그 변수가 정의되어 있지 않으면(typeof가 "undefined") 그 JavaScript 코드가 제대로 실행되지 않은 것으로 간주하고 사용자를 GpgStudy 게임 개발 소식의 임시 보관함 추가 페이지로 직접 재지정합니다.

적재가 실패하는 이유는 크게 두 가지인데, 하나는 HTTPS 페이지에서 HTTP 자원을 적재하려 드는 것이고, 또 하나는 웹페이지의 Content Security Policy(CSP, 내용 보안 정책)입니다. CSP를 이용하면 웹페이지별로 모든 외부 스크립트를 거부하거나, 특정 기원에서 비롯된 스크립트만 허용하도록(이를테면 구글 애드센스를 위해 google.com만 허용하는 등) 설정하는 것이 가능합니다. HTTPS - HTTP 경계 문제와 CSP 둘 다 번역서에서 다루고 있으니 참고하시고요.

그 외에, SOP(동일 기원 정책)은 무관하다고는 할 수 없지만 너무 광범위한 이유라고 생각합니다. 웹페이지에 외부 JavaScript 라이브러리(이를테면 구글 CDN의 jQuery 등)를 포함시키는 것은 아주 일상적인 일인데요. 지금 문제에서 염두에 둔 것은 그런 일상적인 관행과는 반대로 외부 JS의 적재를 명시적으로 금지하는 설정(CSP)이었습니다. 그리고 http://gpgstudy.com/ 서버 자체가 반응을 안 할 수도 있는데, 비현실적인 일은 아니겠지만 이벤트 취지와는 좀 안 맞는 답이겠고요.

setTimeout과 전역 변수 설정 여부를 이용해서 적재 실패를 판정한 후 사용자를 다른 페이지로 보내는 것은 사실 그냥 제가 궁여지책으로 고안한 것일 뿐이고(아무 반응이 없는 것보다는 나은), 아마 더 나은 방법이 있을 것입니다. CSP 자체를 우회하는 방법도 어쩌면 있겠지만 그것은 '공격'의 영역이므로 GpgStudy 게임 개발 소식을 위한 북마클릿에 사용할 수는 없겠고요.


재미있고 유익한 이벤트였죠?^^ 참여해 주신 모든 분께 축하&감사드립니다.

언제 북마클릿에 대해, 개발자는 물론 사용자에게도 도움이 될만한 내용으로 한 번 글을 써보겠습니다.

top
트랙백 0 : 의견 # + 0

Trackback Address :: http://occamsrazr.net/tt/trackback/291

comments powered by Disqus

(2013년 11월 10일자로 블로그에도 DISQUS 시스템을 도입했습니다. 기존 의견의 수정, 삭제, 댓글 추가는 여전히 가능합니다.)


◀ PREV : [1] : ... [55] : [56] : [57] : [58] : [59] : [60] : [61] : [62] : [63] : ... [321] : NEXT ▶