[실습] JWT 구현하기 with Java

gimseonjin616·2021년 10월 18일
0

실습

목록 보기
1/5

JWT Provider

클래스 다이어그램

소스 코드

import io.jsonwebtoken.*;
import javax.xml.bind.DatatypeConverter;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/*
• 최초 작성자 : Carrykim(김선진)

• 최초 작성일 : 2021.10.19

• 최초 변경일 : 2021.10.19

• 목적 : Study

• 개정 이력(변경자, 변경 일자, 변경 내용) : null

• 저작권 : by Carrykim
*/

public class TokenProvider{

    // 암호화 키
    private String secretKey = "Carrykim_secreat_key";

    public String createToken(String id) throws Exception {
        // 유효 기간 밀리초 * 초 * 분 * 시 * 일
        int Validity = 1000 * 60 * 60 * 24 * 3;

        // 암호화 알고리즘
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        // 발급 시간 및 만료 시간
        Date createdTime = new Date();
        Date expireTime = new Date(createdTime.getTime() + Validity);

        // 서명에 담을 데이터
        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey);
        Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

        // 헤더에 담을 데이터
        Map<String, Object> headerMap = new HashMap<String, Object>();

        headerMap.put("typ","JWT");
        headerMap.put("alg","HS256");

        // 토큰 빌드
        JwtBuilder builder = Jwts.builder().setHeader(headerMap)
                .setIssuer(id)
                .setExpiration(expireTime)
                .setIssuedAt(createdTime)
                .signWith(signatureAlgorithm, signingKey);

        return builder.compact();
    }

    public boolean verifyJWT(String jwt) throws Exception {
        try {
            // 토큰에서 페이로드(Claim) 추출
            Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(secretKey))
                    .parseClaimsJws(jwt).getBody();

            // 추출값 확인
            System.out.println("토큰 발급자 : " + claims.getIssuer());
            System.out.println("토큰 만료 시간 : " + claims.getExpiration());
            System.out.println("토큰 발급 시간 : " + claims.getIssuedAt());
            return true;
        } catch (ExpiredJwtException e) {
            // 만료 예외 처리
            System.out.println("토큰 만료");
            return false;
        } catch (JwtException e) {
            // 유효하지 않은 토큰 예외 처리
            System.out.println("유효하지 않은 토큰");
            return false;
        } catch (Exception e){
            // 기타 예외 처리
            System.out.println(e);
            return false;
        }
    }
}

실행결과

profile
to be data engineer

0개의 댓글