JWT는 JSON Web Token의 약자로 사용자의 속성 정보 (Claim)를 JSON 데이터 구조로 표현한 토큰으로 JSON 객체를 통해 가볍고 자가수용적인 (self-contained) 방식으로 사용자 정보를 안전하게 전달해주기 위한 토큰입니다.

JWT 토큰의 구성과 Java에서 JWT 토큰을 생성하고 검증하는 방법에 대해 알아보겠습니다.

 

JWT 토큰의 구성

 

 

JWT 토큰은 세파트로 나누어져 있습니다. header, payload, signature 이렇게 세파트로 나누어져있습니다.

  • header : 토큰타입과 암호화 알고리즘
  • payload : 토큰에 담을 내용
  • signature : 서명

 

JWT 사용 Process

  1. 클라이언트에서 로그인을 시도합니다. (ID / PASSWORD)
  2. 서버는 사용자의 요청을 확인 한 후 JWT를 생성 후 클라이언트에게 전달합니다.
  3. 클라이언트는 JWT를 가지고 서버에 데이터를 요청합니다.
  4. 서버는 JWT Signature 를 확인하고 클라이언트에게 데이터를 반환해줍니다.

 

JWT Java 활용

회원인증과 안정성있는 정보교류를 위해 사용합니다. 아래는 토큰생성과 검증 예시입니다.

 

    /**
     * 토큰생성
     */
    private String createToken(Map<String, Object> claims) {
        String secretKeyEncodeBase64 = Encoders.BASE64.encode(secretKey.getBytes());
        byte[] keyBytes = Decoders.BASE64.decode(secretKeyEncodeBase64);
        Key key = Keys.hmacShaKeyFor(keyBytes);

        Long expiredTime = 1000 * 60L * 60L * 2L; // 토큰 유효 시간 (2시간)

        Date ext = new Date(); // 토큰 만료 시간
        ext.setTime(ext.getTime() + expiredTime);

        return Jwts.builder()
                .signWith(key) //Sign
                .setClaims(claims) //claims
                .setIssuedAt(new Date(System.currentTimeMillis())) //토큰 발급 시각
                .setExpiration(ext) // 토큰 만료 시간
                .compact(); // 토큰 생성
    }

    /**
     * 토큰검증
     */
    public Claims verifyToken(String token) throws UnsupportedEncodingException{
        String secretKeyEncodeBase64 = Encoders.BASE64.encode(secretKey.getBytes());
        Claims claims = null;
        try {
            claims = Jwts.parserBuilder()
                    .setSigningKey(secretKeyEncodeBase64)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException e) { // 토큰 만료
            claims = null;
        }catch (Exception e) { //그외 오류
            claims = null;
        }
        return claims;
    }
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기