1. pom.xml에 의존성 추가하기

Eclipse에서 JWT(Json Web Token)를 사용하려면 jjwt 라이브러리를 의존성에 추가해야 한다.

<dependencies>
  <!-- JWT -->
  <dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
  </dependency>

  <!-- Jackson (JSON 처리용) -->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
  </dependency>
</dependencies>

 

👉 주의: <dependencies>는 반드시 <build> 바깥, <project> 바로 아래에 위치해야 한다.  <build> 아래 있을 경우 Maven 프로젝트 갱신하여도 라이브러리가 다운받아지지 않는다.


2. Maven 프로젝트 갱신

pom.xml 수정 후에는 Eclipse에서 프로젝트 우클릭 → Maven → Update Project (Alt + F5) 를 눌러야 라이브러리가 다운로드 된다.

👉 주의: Update Project 후 라이브러리 다운받아졌는지 확인하기.


3. JWT 토큰 발급 코드

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtExample {
    public static void main(String[] args) {
        String secretKey = "mySecretKey";

        String jwt = Jwts.builder()
                .setSubject("test123")	// 토큰 발행 id
                .setIssuedAt(new Date())	//토큰 발급시간
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1시간 만료
                .signWith(SignatureAlgorithm.HS256, secretKey.getBytes())
                .compact(); // ✅ compact() 호출해야 String 변환됨

        System.out.println("생성된 JWT: " + jwt);
    }
}
 
 
출력 결과 :
생성된 JWT : eyJhbGciOiJIUzI-------kzMzQ0Nzl9.p_qsN6mXOveSgksiscxX-xQdgJkPkE9sK31ZtCT5xlw​


4. JWT 토큰 검증하기

클라이언트가 보낸 JWT를 검증해서 위조 여부만료 여부를 체크합니다.

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

public class JwtVerify {
    private static final String SECRET_KEY = "mySecretKey";

    public static void main(String[] args) {
        String token = "위에서 발급한 토큰 값";

        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY.getBytes())
                    .parseClaimsJws(token)
                    .getBody();

            System.out.println("토큰 주체(subject): " + claims.getSubject());
            System.out.println("만료 시간(expiration): " + claims.getExpiration());
        } catch (Exception e) {
            System.out.println("토큰 검증 실패: " + e.getMessage());
        }
    }
}

 

출력 결과 :

토큰 주체(subject): test123
만료 시간(expiration): Thu Oct 02 00:40:30 KST 2025

5. 발생했던 에러와 해결 방법

(1) Type mismatch: cannot convert from JwtBuilder to String

  • 원인: compact() 호출을 빼먹어서 JwtBuilder 객체를 그대로 String 변수에 담으려 했음
  • 해결: 마지막에 .compact() 붙이기

(2) NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException

  • 원인: jjwt가 JSON 처리를 위해 Jackson 라이브러리를 필요로 하는데, 의존성을 추가하지 않음
  • 해결: jackson-databind (→ core, annotations 자동 포함) 추가

(3) NoClassDefFoundError: javax/xml/bind/DatatypeConverter

  • 원인:
    jjwt 0.9.1은 JDK 1.8을 기준으로 개발되었고, javax.xml.bind 패키지를 사용한다.
    JDK 11 이상에서는 JAXB(Java Architecture for XML Binding)가 JDK 기본에서 제거되었기 때문에 실행 시 오류가 발생한다.
    문제는, Eclipse에서 프로젝트 JRE를 1.8로 설정했음에도 불구하고 실제 실행 JVM은 17이었던 것.
  • 해결 과정

1) 프로젝트 JRE 버전 확인

  • 컴파일러 설정 확인
    • 프로젝트 우클릭 → Properties → Java Compiler
    • Enable project specific settings 체크
    • Compiler compliance level = 1.8
  • 빌드 경로 확인
    • 프로젝트 우클릭 → Properties → Java Build Path → Libraries
    • JRE System Library [JavaSE-1.8] 로 표시돼 있어야 함

👉 하지만 이 설정만으로는 “실행” JVM까지 1.8로 고정되는 게 아님을 알게 됨.


2) 실제 실행 JVM 확인

실제로 어떤 JVM으로 실행 중인지 코드로 확인:

System.out.println("Java version: " + System.getProperty("java.version"));
System.out.println("Java home: " + System.getProperty("java.home"));

 

출력 결과:

Java version: 17.0.12
Java home: C:\Program Files\Java\jdk-17

 

👉 Eclipse는 분명 1.8로 설정했는데도, 실행 JVM은 JDK 17을 사용하고 있었음.


3) 해결 방법

(a) Eclipse에 JDK 1.8 등록

  1. Window → Preferences → Java → Installed JREs
  2. Add... → Standard VM 선택
  3. JDK 1.8 설치 경로 지정
    (예: C:\Program Files\Java\jdk1.8.0_351)
  4. Finish 후 체크박스로 기본(Default) 설정

(b) 프로젝트에 JDK 1.8 적용

  1. 프로젝트 우클릭 → Properties
  2. Java Build Path → Libraries
  3. JRE System Library 선택 후 Edit
  4. Execution Environment → JavaSE-1.8 선택
  5. 방금 등록한 JDK 1.8이 연결돼야 함

(c) Run Configurations에서 실행 JRE 지정

  1. 상단 메뉴 → Run → Run Configurations…
  2. 해당 Java Application 선택
  3. JRE 탭 → Alternate JRE → jdk1.8 선택
  4. Apply 후 실행

✨ 정리

  • jjwt 0.9.1은 JDK 1.8 환경에서 쓰면 가장 편하다.
  • JDK 11 이상에서 쓰려면 JAXB 라이브러리 추가가 필요하다.
  • compact()를 반드시 호출해야 JWT 문자열이 만들어진다.
  • Eclipse에서 실제 실행 JVM 버전이 무엇인지 확인하는 습관을 들이면 디버깅이 훨씬 빨라진다.

 

+ Recent posts