보안 인증 (JWT 인증)

JWT에 대한 소개

JWT (JSON Web Tokens)는 암호화를 사용하여 데이터를 만드는 인터넷 표준 중의 하나입니다. JWT에 대한 보다 자세한 내용은 아래의 페이지를 통해 확인하시기 바랍니다.

JWT를 통한 인증하기

비밀키를 이용하여 고객사의 서버에서 JWT 문자열을 만들어 인증하는 방식입니다. 대부분의 상황에서 권장하는 방식입니다.

<script type="text/javascript" src="https://static.shoplive.cloud/shoplive.js"></script>
<script>cloud.shoplive.init({ accessKey: 'YOUR ACCESS KEY HERE', userJWT: "USER_JWT" });</script>

<!-- OR -->

<script type="text/javascript" src="https://static.shoplive.cloud/shoplive.js"></script>
<script>
  cloud.shoplive.init({ accessKey: 'YOUR ACCESS KEY HERE' });
  cloud.shoplive.setUserJWT("USER_JWT");
</script>

인증 토큰 생성 가이드

Shoplive에서 사용하는 JWT payload는 다음과 같습니다.

데이터설명샘플
exp
(required)
만료시간 (timestamp)1516239022토큰 만료 시간 (Unix Timestamp)
userId
(required)
사용자 아이디shoplive로그인 사용자의 유일성을 보장할 수 있는 값
name사용자 이름
(채팅창에서 사용)
샵라이브이름을 지정하지 않을 경우 캠페인의 채팅 설정에 따라 채팅시 입력을 강제하도록 하거나 임의로 세팅하도록 할 수 있습니다.
gender사용자 성별빈값(미지정), m(남), f(여)전체/로그인 시청자 데이터에서 확인할 수 있습니다.
age사용자 나이25전체/로그인 시청자 데이터에서 확인할 수 있습니다.
custom사용자 임의 데이터custom data최대 1KB까지 임의의 데이터를 세팅할 수 있습니다.
전체/로그인 시청자 데이터에서 확인할 수 있습니다.
userScore사용자 등급10사용자 등급을 세팅하면 등급에 따른 입장 제한, 이벤트 추첨 제한 등의 기준으로 사용할 수 있습니다.
-100에서 100까지의 정수를 세팅할 수 있습니다.
userType사용자 유형VIP방송 입장 제한(Entry Type)이 설정된 방송에 입장할 때, 해당 값을 참조하여 특정 유저(VIP)만 방송에 입장하도록 설정할 수 있습니다.

샘플 코드 (JWT 생성)

Java

import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtAuthorizationGeneratorSample {
    public static void main(String[] args) {
        /*
         * 암호화 알고리즘
         * 지원하는 알고리즘은 https://jwt.io/ 혹은 https://github.com/jwtk/jjwt 사이트를 참조하세요
         */
        String algorithm = "HS256";
        /*
         * 발급 받은 base64 인코딩된 secret key
         */
        String base64EncodedSecretKey = "ckFXaWtRWENtSTA2QnpGVmxWNlBySWF4cUk1Q1pxbHU=";
        /*
         * 유효 시간을 12시간으로 설정
         */
        long expiration = System.currentTimeMillis() + 12 * (60 * 60 * 1000);
        // OR
        // long expiration = LocalDateTime.now().plus(12, ChronoUnit.HOURS).atZone(ZoneId.systemDefault()).toEpochSecond();
        /*
         * 사용자 아이디
         * 이 아이디를 기준으로 서비스 사용자를 구분하며 최대 255바이트까지 설정할 수 있습니다
         */
        String userId = "sample_user_id";
        /*
         * 채팅에 노출할 사용자명
         * 금칙어에 해당하는 단어는 별표(*)로 대체되어 표시됩니다
         */
        String name = "my_nickname";
        /*
         * 접속자 통계에서 참조할 성별 정보입니다.
         * 남성(m), 여성(f), 기타(n, null, etc.)
         */
        String gender = "f";
        /*
         * 접속자 통계에서 참조할 연령 정보입니다.
         * 임의의 숫자로 입력할 수 있으며 통계에는 5세 단위로 그룹화하여 표시합니다.
         */
        Integer age = 15;
        
        /**
         * 사용자 임의 데이터
         */
        String custom = "{\"userGrade\":\"VIP\"}";
        
        /**
         * 사용자 등급
         */
        int userScore = 34;
      
        /**
         * 사용자 프로필 이미지 URL
         */
        String profile = "https://image.shoplive.cloud/sample_profile.png";

        JwtBuilder builder = Jwts.builder()
            .signWith(SignatureAlgorithm.forName(algorithm), base64EncodedSecretKey)
            .setExpiration(new Date(expiration))
            .setIssuedAt(new Date())
            .claim("userId", userId)
            .claim("name", name)
            .claim("gender", gender)
            .claim("age", age)
            .claim("custom", custom)
            .claim("userScore", userScore)
            .claim("profile", profile);
      
        String jwt = builder.compact();
        System.out.printf("jwt: " + jwt);
    }
}
결과

jwt: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTA1NzA1MDgsImlhdCI6MTYxMDUyNzMwOCwidXNlcklkIjoic2FtcGxlX3VzZXJfaWQiLCJuYW1lIjoibXlfbmlja25hbWUiLCJnZW5kZXIiOiJmIiwiYWdlIjoxNX0.0Z5YUo99149fIFyfqwxa-7SLyqC0RHR1T8P7jZLhpG8

📘

Java 이외의 다른 프로그래밍 언어를 통해 JWT 생성하고 인증을 구현하고자 할 경우 Shoplive 담당자에 문의하여 지원을 받을 수 있습니다.