보안 토큰

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.eyJleHAiOjE2NjI0ODA3ODMwLCJwYXRoIjoiL2Zvby9zYW1wbGUubXA0In0.NSO1VgouVfQBpJLlGZsk4r466wz6ba3weOm2Ba4VVUI

  • 만료시간(exp): 16624807830

  • 인증 경로(path): /foo/sample.mp4

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI0ODA3ODMwLCJwYXRoIjoiL2Zvby9zYW1wbGUubXA0In0.NSO1VgouVfQBpJLlGZsk4r466wz6ba3weOm2Ba4VVUI

구조와 생성

보안 토큰의 구조는 헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분으로 구성되어 있습니다.

<토큰 생성 예제>

JWT 라이브러리(Java, PHP)를 사용하여 토큰을 생성하는 방법은 아래 “토큰 생성 예제”를 참고하세요.

JOSE(JSON Object Signing and Encryption) 헤더

헤더는 토큰을 어떻게 해석해야 하는지 명시한 부분으로 알고리즘과 데이터 타입을 정의합니다.

Key
설명
Value

alg

서명(Signature) 생성시에 사용한 알고리즘을 정의.

  • HS256

    • 현재는 SHA-256 알고리즘만 지원합니다.

typ

클레임의 표현 형식을 정의.

  • JWT

    • 현재 는 JWT 형식만 지원합니다.

페이로드(Payload)

페이로드가 포함하고 있는 모든 클레임을 클레임 셋(Claim Set)이라고 부릅니다.

Key
설명
Value

exp

만료 시간(Expiration Time)

  • 만료시간

path

클레임의 표현 형식을 정의.

  • 인증 경로(Path)

    • (/)를 포함한 디렉터리 또는, 콘텐트 파일의 실제 경로를 의미합니다. 인증 경로가 디렉터리 일 경우에는 하위 경로에 대한 접근 권한도 포함합니다.

playstart

재생 시작 시간(초)으로 VOD 서비스에서만 지원합니다.

  • 재생 시작 시간(초)

duration

재생 시간(초)으로 라이브, VOD 서비스에서 지원합니다.

  • 재생 시간(초)

<스트리밍 서비스>

스트리밍 서비스는 인증 경로에 가상 파일을 포함하지 않도록 주의해야 합니다. 가상 파일에 대한 설명은 부록 부록의 “가상 파일(Virtual file)”을 참고하세요.

서명(Signature)

토큰은 헤더와 페이로드를 위∙변조 할 수 없도록 반드시 보안-키(Secure Key)를 사용하여 SHA-256 알고리즘으로 서명해야 합니다.

<보안-키>

비밀 키(Secret Key)라고도 불리며, CDN과 콘텐트 제공자(Content Provider)간의 보안 채널을 생성하기 위해서 미리 공유하는 키입니다.

Signing. (출처: http://100bytes.com/tutorials/security/jwt/json-web-signature)

서명에 대한 예시

아래는 서명 방법을 예시를 통해 설명합니다.

  • 헤더와 페이로드를 각각 BASE64로 인코딩(Encoding)합니다.

데이터
문자열
BASE64 인코딩

헤더

{

"alg": "HS256",

"typ": "JWT"

}

eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp

XVCJ9

페이로드

{

"exp": 16624807830,

"path": "/foo/sample.mp4"

}

eyJleHAiOjE2NjI0ODA3ODMwLCJwYXRoIjoiL2Zvby9zYW1wbGUubXA0In0

  • 마침표(.)를 구분 자로 사용하여 헤더와 페이로드를 연결합니다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

eyJleHAiOjE2NjI0ODA3ODMwLCJwYXRoIjoiL2Zvby9zYW1wbGUubXA0In0

  • 마지막으로 위의 문자열을 보안-키(Secure key)와 함께 SHA-256 알고리즘으로 해시 값을 추출합니다.

HMACSHA256(

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI0ODA3ODMwLCJwYXRoIjoiL2Zvby9zYW1wbGUubXA0In0”,

Secure Key

)

Last updated

Was this helpful?