0. 라이브러리 설치
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
1. 환경설정
1-1. /jwt/JwtUtil.java
- SECURITY_KEY
: salt값
- VALIDATE_TIME
: 만료시간
package com.example.jwt;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import org.springframework.stereotype.Service;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
// 토큰발행 및 정보 추출용
@Service
public class JwtUtil {
// final은 상수, 변경할수 없음
// salt값
private final String SECURITY_KEY = "randomKey#12";
// 만료시간
// 1000 => 1초
// 9H
private final long VALIDATE_TIME = 1000 * 60 * 60 * 9;
// 토큰생성
public String generatorToken(String username) {
Map<String, Object> map = new HashMap<String, Object>();
String token = Jwts.builder()
.setClaims(map)
.setSubject(username)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + VALIDATE_TIME))
.signWith(SignatureAlgorithm.HS256, SECURITY_KEY)
.compact();
return token;
}
// 정보 추출용 메소드
private <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
final Claims claims = Jwts.parser().setSigningKey(SECURITY_KEY).parseClaimsJws(token).getBody();
return claimsResolver.apply(claims);
}
// 토큰에서 아이디 추출
public String extractUsername(String token) {
return extractClaim(token, Claims::getSubject);
}
// 토큰에서 만료시간 추출
public Date extractExpiration(String token) {
return extractClaim(token, Claims::getExpiration);
}
// 유효시간 체크
public boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}
// 토큰이 유효한지 체크
public boolean isTokenValidation(String token, String uid) {
String username = extractUsername(token);
if(username.equals(uid) && isTokenExpired(token)) {
return true;
}
return false;
}
}
1-2.