본문 바로가기
Computer Science/Web & Network

[Web] Subresource Integrity

by softserve 2023. 1. 30.
반응형

1. 개요

 

직역하면 '하위 자원 무결성' 이라는 의미를 가지고 있습니다.

SRI 는 써드파티 서버에서 제공하는 리소스들이 변조되지 않았음을 개발자들이 확신할 수 있도록 하는 W3C 사양입니다.

CDN을 피해야하는 이유에서 본 것처럼 CDN을 통해서 외부 리소스를 로드할 경우에는 Subresource Integrity(이하, SRI)를 활용하여 CDN의 취약점을 보완해줄 필요가 있습니다.

 

2. 사용법

 

먼저 integrity 속성에 넣어줄 SRI hash 값을 생성해야 합니다.

이 값은 "해시 알고리즘-해시값" 형태로 되어있습니다.

 

1) SRI Hash generator

https://www.srihash.org/ 에서 로드할 리소스의 주소(아래의 경우 https://code.jquery.com/jquery-3.6.1.js)를 넣으면 아래와 같이 해시값을 포함한 <script> 요소를 알아서 만들어줍니다. 

<script src="https://code.jquery.com/jquery-3.6.1.js" 
integrity="sha256-3zlB5s2uwoUzrXK3BT7AX3FyvojsraNFxCc2vC/7pNI=" 
crossorigin="anonymous"></script>

 

서로 다른 출처에서 요청을 하는 경우에 어떻게 처리할 것인지를 crossorigin 속성을 통해 설정할 수 있습니다.

crossorigin 속성을 anonymous로 지정할 경우 요청이 CORS header를 사용하며, credentials flag가 'same-origin'으로 설정됩니다. 동일한 출처일 경우에만 자격 증명을 하겠다는 것이므로 동일한 출처가 아닌 경우 자격 증명의 교환이 이루어지지 않습니다. 쿠키나 HTTP 인증 정보를 전송하지 않는다는 거죠. 공백이나 임의의 문자열을 넣은 경우에도 anonymous와 같습니다. (예를 들면 crossorigin="abcd" crossorigin="")

반면 use-credentials로 지정할 경우 credential flag가 'include'로 설정되며 항상 user credentials을 포함하게 됩니다.

crossorgin을 적지 않는 경우 CORS 를 사용하지 않게 됩니다.

 

2) Openssl

$ cat jquery-3.6.1.js | openssl dgst -sha384 -binary | openssl base64 -A

CLI 에서는 openssl을 사용해 SRI hash를 생성할 수도 있습니다.

dgst 명령어는 입력받은 메시지를 주어진 해시 함수에 통과시킨 결과물인 메시지 다이제스트를 출력합니다.

위는 jquery-3.6.1.js 의 내용을 sha384 알고리즘으로 변환한 다음 binary 형태로 출력하되, base64로 다시 인코딩 해주는 명령입니다.

즉 이렇게 생긴 원본 js 파일을 

요렇게 암호화했는데 알아볼 수가 없으니

base64로 인코딩해서 위와 같이 문자열로 바꿔주는 겁니다!

 

3. 작동원리

 

브라우저가 integrity 속성을 가진 <script> 나 <link> 요소를 발견하면 실행하기 전에 integrity 속성에 담겨진 해시 값과 명시된 경로에 위치한 실제 js 또는 css 파일 등이 일치하는 지를 검사하게 됩니다. 일치하지 않는다면 브라우저는 해당 리소스의 실행을 거부하고 fetching이 실패했다는 것을 알리는 네트워크 에러를 리턴합니다.

요소를 포함하고 있는 문서가 아닌, 다른 출처에서 제공되는 리소스의 경우 CORS를 이용하여 추가적인 검사를 합니다. 리소스를 제공하는 origin이 리소스를 요청하고 있는 origin과의 공유를 허용하고 있는 지를 확인하는 거죠.

 

참조 :

https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity

https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin

https://medium.com/@clare.lindley/subresource-integrity-checking-and-content-security-policies-4160ae5c0428

 

반응형

댓글