본문 바로가기

프로그래밍

JWT Token 생성 - Java and Javascript

반응형

Java 로는 많이 만들어봤느데, javascript 로는 해보지 않아 정리해봅니다.

라이브러리는 node에서 쉽게 받을 수 있습니다.

 

const jwt = require('jsonwebtoken');

const signKey = 'signkey로사용할조금긴문자열을입력합니다.';
const expirationTimeInSec = 86400; // 24시간 (초 단위)

function generateBasicToken(subject) {
    const createdDate = Math.floor(Date.now() / 1000); // 초 단위로 현재 시간
    const claims = {
        iat: createdDate, // 발행 시간 (초 단위)
        exp: createdDate + expirationTimeInSec // 만료 시간 (초 단위)
    };

    return generate(claims, subject);
}

function generate(claims, subject) {
    return jwt.sign(claims, signKey, {
        subject: subject,
        algorithm: 'HS512'
    });
}

// 테스트
const token = generateBasicToken('test_subject');
console.log(token);

 

보내는 곳에서 token 을 직접 만들어 전달한다면 signkey 와 알고리즘을 동일하게 유지해야 합니다.

암호화에서 보면 공개키, 개인키 가 있는데, 일종의 개인키라고 봐도 됩니다.. 외부에 노출되면 절대 안되는 코드..

 

javascript의 경우 비교적 간단하게 만들어집니다.

 

Java의 경우 아래와 같이 작성합니다.

import java.time.Instant;
import java.security.Key;
import javax.annotation.PostConstruct;

import org.springframework.stereotype.Component;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.spec.SecretKeySpec;

@Component
public class TokenUtil {
    private Key key;
    private String signKey = "signkey는동일하게입력해주면됩니다.길게입력해야합니다.";
    private static long expirationTimeInSec = 86400L; // 24시간 유효
    @PostConstruct
    public void init(){
        this.key = new SecretKeySpec( DatatypeConverter.parseBase64Binary( signKey), SignatureAlgorithm.HS512.getJcaName());
    }
    
    public String generateBasicToken(String subject) {
        final Instant createdDate = Instant.now();
        Map<String, Object> claims = new HashMap<>();
        claims.put("iat", createdDate.toEpochMilli());
        claims.put("exp", createdDate.plusSeconds( expirationTimeInSec).toEpochMilli());
        return generate(claims, subject);
    }
    
    private String generate(Map<String, Object> claims, String subject) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .signWith( key)
                .compact();
    }
}

 

위 두 코드는 동일한 token 을 생성해냅니다. 

claims 는 token 에 담을 데이터 입니다.

iat 는 토큰 생성시간

exp 는 만료시간입니다.

 

따로 데이터를 select하는 과정을 거치지 않더라도 이 암호화된 token 에서 데이터를 저장하고 꺼내 쓸 수 있습니다.

일종의 세션 데이터를 들고다닌다고 보면 될거 같습니다.

 

너무 큰 데이터를 가지고 다니기에는 오버헤드가 발생할 수 있으니, 꼭 필요한 데이터만 넣도록 합니다.

반응형