brunch

You can make anything
by writing

C.S.Lewis

by 테크유람 Mar 28. 2021

하위 자원 무결성 확인을 위한 SRI

SRI(Subresource Integrity)로 무결성 확보하기

JQuery, BootStrap 등의 서드 파티 자바스크립트 라이브러리를 사용하는 방법엔 크게 두 가지가 있습니다. 첫째로 직접 운영하는 웹 서버로 복제하여 내가 서비스하는 도메인과 동일한 도메인으로 사용하는 방법입니다. 두 번째는 서드 파티 업체가 사용하는 CDN(Content Delivery Network)이 적용된 서비스 도메인을 호출하여 사용하는 것입니다.


JQuery를 제공하는 https://code.jquery.com 에선 Jquery 라이브러리를 어떻게 HTML에 삽입하여 사용하는지 <script> 태그 예제를 알려줍니다.


code.jquery.com 도메인의 정보를 검색해보니 Highwinds Network Group으로 CNAME이 되어있네요.

$dig code.jquery.com +short
cds.s5x3j6q5.hwcdn.net.
209.197.3.24


일반적으로 외부에 있는 자바스크립트를 삽입하는 방법은 다음 구문으로 충분합니다. HTML에 포함된 <script> 태그를 읽은 브라우저는 해당 주소의 자바스크립트 파일을 다운로드하고 실행합니다.

<script src="https://code.jquery.com/jquery-3.5.1.js"</script>


그렇지만 Jquery.com에서 알려주는 태그 사용법에는 integrity, crossorigin 속성이 추가되었네요. Integrity는 URL의 해시값을 의미합니다. crossorigin 속성은 CORS에서 사용하는 것과 동일합니다.


아래 예제에서는 SHA256 방식으로 https://code.jquery.com/jquery-3.5.1.js 파일을 해시한 값이 "sha256-QWo7 LDvxbWT2 tbbQ97 B53 yJnYU3 WhH/C8 ycbRAkjPDc="라는 의미입니다.


브라우저는 만약 이 해시 값이 다운로드 완료한 스크립트 파일의 실제 해시값과 비교하고, 만약 두 개의 값이 다르다면 해당 스크립트는 실행하지 않습니다.

<script   
   src="https://code.jquery.com/jquery-3.5.1.js"   
   integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc="    crossorigin="anonymous">
</script>


SRI(Subresource Integrity)는 위와 같은 방식으로 스크립트의 내용이 중간에 변조되어 실행되는 것을 해시값을 비교하여 브라우저 차원에서 방지하기 위해 만들어졌습니다. 대부분의 최신 브라우저에서 지원됩니다.

<caniuse.com에서 SRI 지원 여부 검색>

SRI는 일반적으로 <script>, <link> 태그와 함께 사용됩니다. integrity 속성은 하나 이상의 값을 가지며, sha256, sha384, sha512와 같은 해시 알고리즘의 명칭을 prefix로 시작되는 값입니다. 그 뒤엔 대시 '-'와 base64 인코딩 된 해시값이 따라옵니다. 즉 위의 예제는 SHA256 해시를 사용하며 그 해시 값은 "QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDC="라는 의미입니다.


OpenSSL 혹은 shasum 명령문으로 간단히 이러한 해시값을 만들 수 있습니다. 만약 스크립트의 일부가 수정되면 해시값은 완전히 바뀌게 됩니다.

$cat myScript.js | openssl dgst -sha256 -binary | openssl base64 -A oOQFy8LLF9Z7wOZ7JI/xU0DfP/LuVRaumnD9P2iHw2M=

$shasum -b -a 256 myScript.js | awk '{ print $1 }' | xxd -r -p | base64 oOQFy8LLF9Z7wOZ7JI/xU0DfP/LuVRaumnD9P2iHw2M=


SRI는 비단 자바스크립트뿐만 아니라 외부 CSS를 참조하여 사용할 때도 적용할 수 있습니다.

<link rel="stylesheet" href="https://site53.example.net/style.css"
 integrity="sha384+/M6kredJcxdsqkczBUjMLvqyHb1K/JThDXWsBVxMEeZHEaMKEOEct339VItX1zB" crossorigin="anonymous">


SRI가 필요한 이유는 인터넷 구간 중에 스크립트가 변조되어 정보 유출에 사용되는 경우가 빈번하기 때문입니다. 대표적으로 메이지 카트(Magecart) 공격이 있습니다. 다른 장에서 이 주제를 다루었으니 참고하세요.








브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari