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 등록
- Window → Preferences → Java → Installed JREs
- Add... → Standard VM 선택
- JDK 1.8 설치 경로 지정
(예: C:\Program Files\Java\jdk1.8.0_351) - Finish 후 체크박스로 기본(Default) 설정
(b) 프로젝트에 JDK 1.8 적용
- 프로젝트 우클릭 → Properties
- Java Build Path → Libraries 탭
- JRE System Library 선택 후 Edit
- Execution Environment → JavaSE-1.8 선택
- 방금 등록한 JDK 1.8이 연결돼야 함
(c) Run Configurations에서 실행 JRE 지정
- 상단 메뉴 → Run → Run Configurations…
- 해당 Java Application 선택
- JRE 탭 → Alternate JRE → jdk1.8 선택
- Apply 후 실행
✨ 정리
- jjwt 0.9.1은 JDK 1.8 환경에서 쓰면 가장 편하다.
- JDK 11 이상에서 쓰려면 JAXB 라이브러리 추가가 필요하다.
- compact()를 반드시 호출해야 JWT 문자열이 만들어진다.
- Eclipse에서 실제 실행 JVM 버전이 무엇인지 확인하는 습관을 들이면 디버깅이 훨씬 빨라진다.
'SpringBoot > 공부' 카테고리의 다른 글
| [JavaScript] JSP와 Document 객체의 관계 정리 (0) | 2025.10.15 |
|---|---|
| [SpringBoot] 컨트롤러 API 테스트 (@WebMvcTest, MockMvc) (0) | 2025.02.02 |
| [SpringBoot]junit5에서 junit4로 변경 (0) | 2023.12.18 |
| [SpringBoot] spring-boot-devtools 라이브러리 사용 방법 (0) | 2023.12.14 |
| [SpringBoot] 프로젝트 생성 시 run 오류 (0) | 2023.12.13 |