ATTRIBUTES

Editing
  • account_tree
  • bug_report

nonce

콘텐츠 보안 정책에서 주어진 요소에 대해 주어진 가져오기를 진행할 수 있는지 여부를 결정하는 데 사용할 수 있는 암호화 nonce(한번 사용하는 암호화 임시값)를 정의한다.

설명

nonce 애트리뷰트가 정의된 요소는 정의된 값을 가져와서 [[CryptographicNonce]]라는 내부 슬롯으로 이동(보안상 nonce 애트리뷰트의 값은 빈 문자열로 자동 바꿈)하여 암호화 난스(nonce)가 특정 항목에만 노출되도록 한다.

nonce는 외부에서 인젝션(injection) 공격을 막기 위한 방안으로 추가되었다. 즉 특정 인라인(inline) 스크립트 또는 스타일 요소의 콘텐츠가 외부에서 주입된 것이 아니라 소유자가 정상적으로 문서에 포함했다는 것을 확인하는 CSP(Content Security Policy)의 제한적인 대안이 될 수 있는 메커니즘이다.

어디까지나 보안을 위한 설정으로써 꼭 필요한 것은 아니다. 또한 이 방식이 모든 상황에 안전하다고 볼 수도 없다. 따라서 가급적 인라인 작성 방식은 지양하도록 하는 것이 좋겠고 부득이하게 작성되어야 하는 경우에 필요에 따라 제한적으로 사용하도록 하는 것이 좋다.

nonce를 활성하기 위해서는 다음과 같은 단계를 참고한다.

해쉬 값 생성과 설정

암호학적으로 안전한 난수 생성기로 최소 128비트 데이터의 임의 base64 인코딩된 문자열을 생성한다. 이 값은 페이지가 로드될 때 마다 새로 생성되어야 한다. 생성 환경은 서버 사이드 스크립트를 활용한다. 아래 예시는 PHP 환경으로 작성되었다.

<?php
$cipher="aes-256-cbc";
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);

$key = time();
$nonceOrigin = time();

$data = openssl_encrypt($nonceOrigin, $cipher,$key, OPENSSL_RAW_DATA, $iv);
$nonc = base64_encode($data);
?>
<script type="text/javascript" nonce="<?=$nonce?>">
// code..
</script>

CSP 헤더로 nonce 전송

# 임의로 작성된 해쉬를 예
Content-Security-Policy: script-src 'nonce-2gzEUOxo9T1pvNKijl7Ueg=='

버전 명세

HTML Standard
#attr-nonce

지원 웹브라우저