보안 토큰
CDN 서비스 에서는 인증 방법으로 보안 토큰을 사용합니다. 본 장에서는 클레임(Claim) 기반의 JWT(Json Web Token)를 사용하여 보안 토큰을 생성하고, 전달하는 방법에 대해 설명합니다.
보안 토큰에 정의되어 있는 개별 정보를 클레임(Claim)이라고 부르며, 클레임 이름(Claim Name)과 클레임 값(Claim Value)이 key-value 쌍으로 구성되어 있습니다.
JWT(Json Web Token)
JWT는 JSON 형식으로 기술한 클레임 기반의 데이터 전송 표준 규약입니다. 자세한 설명은 아래 사이트를 참고하시길 바랍니다.
참고사이트
http://jwt.io 에서는 웹 페이지에서 토큰을 생성∙검증할 수 있고, 개발 언어 별 라이브러리 정보를 제공합니다.
전달 방법
보안 토큰은 HTTP 쿼리 파라미터로 전달되고, 만료 시간(exp), 인증 경로(path) 등의 정보를 포함하고 있습니다. 아래는 인증 URL에 대한 예시입니다.
<스트리밍 서비스>
스트리밍 서비스에서의 전달 방법은 부록 “프로토콜에 따른 전달 방법” 절을 참고하시길 바랍니다.
기본적인 인증 URL의 예.
콘텐트 경로: /foo/sample.mp4
보안 토큰: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNDM0MjkwNDAwMDAwIiwicGF0aCI6Ii9mb28vc2FtcGxlLm1wNCJ9.mPYgbzchlBCu_yHjuCdbTxX9egIWD43TKG-49lhb9l4
만료시간(exp): 1234567890
인증 경로(path): /foo/sample.mp4
http://vod.solbox.com/foo/sample.mp4?token= eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNDM0MjkwNDAwMDAwIiwicGF0aCI6Ii9mb28vc2FtcGxlLm1wNCJ9.mPYgbzchlBCu_yHjuCdbTxX9egIWD43TKG-49lhb9l4
구조와 생성
보안 토큰의 구조는 헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분으로 구성되어 있습니다.
<토큰 생성 예제>
JWT 라이브러리(Java, PHP)를 사용하여 토큰을 생성하는 방법은 아래 “토큰 생성 예제”를 참고하세요.
JOSE(JSON Object Signing and Encryption) 헤더
헤더는 토큰을 어떻게 해석해야 하는지 명시한 부분으로 알고리즘과 데이터 타입을 정의합니다.
Key | 설명 | Value |
---|---|---|
alg | 서명(Signature) 생성시에 사용한 알고리즘을 정의. |
|
typ | 클레임의 표현 형식을 정의. |
|
페이로드(Playload)
페이로드가 포함하고 있는 모든 클레임을 클레임 셋(Claim Set)이라고 부릅니다.
Key | 설명 | Value |
---|---|---|
exp | 만료 시간(Expiration Time) |
|
path | 클레임의 표현 형식을 정의. |
|
playstart | 재생 시작 시간(초)으로 VOD 서비스에서만 지원합니다. |
|
duration | 재생 시간(초)으로 라이브, VOD 서비스에서 지원합니다. |
|
<스트리밍 서비스>
스트리밍 서비스는 인증 경로에 가상 파일을 포함하지 않도록 주의해야 합니다. 가상 파일에 대한 설명은 부록 부록의 “가상 파일(Virtual file)”을 참고하세요.
서명(Signature)
토큰은 헤더와 페이로드를 위∙변조 할 수 없도록 반드시 보안-키(Secure Key)를 사용하여 SHA-256 알고리즘으로 서명해야 합니다.
<보안-키>
비밀 키(Secret Key)라고도 불리며, CDN과 콘텐트 제공자(Content Provider)간의 보안 채널을 생성하기 위해서 미리 공유하는 키입니다.
서명에 대한 예시
아래는 서명 방법을 예시를 통해 설명합니다.
헤더와 페이로드를 각각 BASE64로 인코딩(Encoding)합니다.
데이터 | 문자열 | BASE64 인코딩 |
---|---|---|
헤더 | { "alg": "HS256", "typ": "JWT" } | eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp XVCJ9 |
페이로드 | { "exp": "1434290400000", "path": /foo/sample.mp4" } | eyJleHAiOiIxNDM0MjkwNDAwMDAwIiw icGF0aCI6Ii9mb28vc2FtcGxlLm1wNC J9 |
BASE64 인코딩 문자열은 URL-Safe를 보장하고, 패딩(padding)은 제거해야 합니다.
마침표(.)를 구분 자로 사용하여 헤더와 페이로드를 연결합니다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJleHAiOiIxNDM0MjkwNDAwMDAwIiwicGF0aCI6Ii9mb28vc2FtcGxlLm1wNCJ9
마지막으로 위의 문자열을 보안-키(Secure key)와 함께 SHA-256 알고리즘으로 해시 값을 추출합니다.
HMACSHA256(
“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNDM0MjkwNDAwMDAwIiwicGF0aCI6Ii9mb28vc2FtcGxlLm1wNCJ9”,
Secure Key
)
Last updated