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)는 위와 같은 방식으로 스크립트의 내용이 중간에 변조되어 실행되는 것을 해시값을 비교하여 브라우저 차원에서 방지하기 위해 만들어졌습니다. 대부분의 최신 브라우저에서 지원됩니다.
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) 공격이 있습니다. 다른 장에서 이 주제를 다루었으니 참고하세요.