01DEFINITION
한 줄로 말하면
외부에서 불러오는 스크립트에 무결성 해시를 붙여 두면, 파일이 조금이라도 달라졌을 때 브라우저가 실행을 거부합니다. 이 한 줄이 없으면 배포처가 바뀌었는지 우리 쪽에서는 알 방법이 없고, 바뀐 사실은 대개 사고가 난 뒤에 드러납니다.
02RISK
없으면 무슨 일이 생기나
외부 주소로 스크립트를 불러오는 순간 그 파일의 관리 권한이 우리 손을 떠납니다. 방문자의 브라우저는 그 주소로 직접 요청을 보내고, 돌아온 내용을 우리 페이지와 같은 권한으로 실행합니다. 그 파일이 어제와 다른 내용이어도 브라우저는 아무 말도 하지 않습니다. 배포처가 계정을 잃었거나, 도메인이 만료되어 다른 사람에게 넘어갔거나, 내부자가 한 줄을 더했을 때 우리 쪽에는 아무 흔적도 남지 않습니다.
실제로 이 방식으로 벌어진 사고는 결제 화면에서 가장 비쌌습니다. 통계나 채팅 위젯 스크립트가 바뀌면서 입력 폼의 값을 다른 서버로 함께 보내는 코드가 몇 줄 붙었고, 화면은 평소와 똑같이 동작했습니다. 이용자도 운영자도 이상을 느낄 자리가 없었고, 카드사 쪽에서 피해가 몰려 든 뒤에 원인을 거슬러 올라가 찾았습니다.
무결성 해시는 그 자리를 브라우저에게 검사시킵니다. 파일의 지문을 우리가 태그에 적어 두면, 브라우저는 받은 내용의 지문을 계산해 비교하고 다르면 실행하지 않습니다. 막는 것이 아니라 알아채는 장치에 가깝습니다. 다른 것을 받으면 그 기능이 동작하지 않으므로 우리가 그날 알게 됩니다.
03CHECK IT YOURSELF
직접 확인하는 방법
아래는 저희를 거치지 않고 지금 해 보실 수 있는 방법입니다. 결과를 저희에게 보내실 필요도 없습니다.
-
01
외부 주소로 부르는 스크립트를 먼저 셉니다
우리 도메인이 아닌 주소를 가리키는 script 태그를 뽑습니다. 여기 나오는 것이 전부 대상입니다. 개수 자체가 이 항목과 외부 스크립트 항목의 출발점입니다.
$ curl -s https://example.com/ \ | grep -oE '<script[^>]+src="https?://[^"]+"' \ | grep -v 'example\.com'
나머지 확인 방법 2단계는 셀프수리 가이드에 있습니다.
04HOW TO FIX
고치는 방법
서버 환경에 따라 적을 자리가 다릅니다. 아래는 가장 흔한 구성 기준이고, 적용 전에 현재 설정을 백업하십시오.
파일을 받아 지문을 뽑고 그 값을 integrity 에 적습니다. crossorigin 을 함께 적어야 브라우저가 내용을 읽을 수 있고, 빠뜨리면 검사 자체가 성립하지 않아 파일이 실행되지 않습니다.
가이드 안내 보기 · 먼저 무료로 진단받기
이미 열람권을 구매하셨다면 안내 메일의 가이드 링크로 바로 열립니다 — 링크를 잃으셨다면 문의 주시면 다시 보내 드립니다.
05FAQ
자주 묻는 질문
유명한 CDN 이면 안 붙여도 되지 않나요
- 규모가 크다고 안 바뀌는 것은 아닙니다. 오히려 널리 쓰이는 배포처일수록 한 번 바뀌었을 때 영향받는 사이트가 많아 노리는 값이 큽니다. 그리고 해시를 붙이는 비용은 배포할 때 한 줄이라 규모와 상관없이 같습니다.
해시를 붙였는데 화면이 멈췄습니다
- 받은 파일이 적어 둔 지문과 다르다는 뜻입니다. 배포처가 파일을 갱신했거나, 최신판을 주는 주소를 쓰고 있거나, crossorigin 속성을 빠뜨린 경우입니다. 브라우저 콘솔에 어느 파일이 거부됐는지 나오므로 그 주소부터 확인하십시오.
스크립트가 아니라 스타일시트도 해당되나요
- 됩니다. 외부 스타일시트도 같은 속성을 붙일 수 있고, 화면을 통째로 바꿔 놓는 공격에 쓰일 수 있으므로 같이 보는 것이 맞습니다. 다만 실행 권한을 갖는 스크립트 쪽이 잃을 것이 훨씬 크므로 순서는 스크립트가 먼저입니다.
해시를 관리하기가 번거롭습니다
- 외부 파일을 버전과 함께 고정해 두면 바꿀 일 자체가 드뭅니다. 자동화가 필요하다면 빌드 단계에서 파일을 받아 지문을 계산하고 태그에 채워 넣는 방식이 흔합니다. 손으로 관리하기 어려울 만큼 외부 파일이 많다면, 그 개수 자체가 먼저 볼 문제입니다.
RELATED
같이 보시면 좋은 항목
GET STARTED
내 사이트는
이 항목을 통과할까요
주소만 넣으시면 이 항목을 포함해 58가지를 판정해 점수와 실패 개수를 보여 드립니다. 로그인도, 소유 확인도 필요 없습니다 — 전부 밖에서 관찰만 하는 항목이기 때문입니다.