JWT 발급 및 검증 클래스

bigtr3·2024년 9월 4일

JWT 발급과 검증

로그인시 → 성공 → JWT 발급
접근시 → JWT 검증

JWT에 관해 발급과 검증을 담당할 클래스가 필요하다. 따라서 JWTUtil이라는 클래스를 생성하여 JWT 발급, 검증 메소드를 작성하는 시간입니다.

JWT 생성 원리

JWT.IO 공식 홈페이지 바로가기

JWT는 Header.Payload.Signature 구조로 이루어져 있다. 각 요소는 다음 기능을 수행한다.

  • Header
    - JWT임을 명시
    - 사용된 암호화 알고리즘
  • Payload
    - 정보
  • Signature
    - 암호화알고리즘((BASE64(Header))+(BASE64(Payload)) + 암호화키)

JWT의 특징은 내부 정보를 단순 BASE64 방식으로 인코딩하기 때문에 외부에서 쉽게 디코딩 할 수 있다.

외부에서 열람해도 되는 정보를 담아야하며, 토큰 자체의 발급처를 확인하기 위해서 사용한다.

(지폐와 같이 외부에서 그 금액을 확인하고 금방 외형을 따라서 만들 수 있지만 발급처에 대한 보장 및 검증은 확실하게 해야하는 경우에 사용한다. 따라서 토큰 내부에 비밀번호와 같은 값 입력 금지)

  • signature를 통해 발급처에서만 원본을 구현 가능

JWT 암호화 방식

  • 암호화 종류
    - 양방향
    - 대칭키 - 이 프로젝트는 양방향 대칭키 방식 사용 : HS256
    - 비대칭키
    - 단방향

JWTUtil

  • 토큰 Payload에 저장될 정보
    - username
    - role
    - 생성일
    - 만료일

  • JWTUtil 구현 메소드
    - JWTUtil 생성자
    - username 확인 메소드
    - role 확인 메소드
    - 만료일 확인 메소드

    @Component
    public class JWTUtil {
    
       private SecretKey secretKey;
    
       public JWTUtil(@Value("${spring.jwt.secret}")String secret) {
    secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), Jwts.SIG.HS256.key().build().getAlgorithm());
}

public String getUsername(String token) {

    return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("username", String.class);
}

public String getRole(String token) {

    return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("role", String.class);
}

public Boolean isExpired(String token) {

    return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().getExpiration().before(new Date());
}

public String createJwt(String username, String role, Long expiredMs) {

    return Jwts.builder()
            .claim("username", username)
            .claim("role", role)
            .issuedAt(new Date(System.currentTimeMillis()))
            .expiration(new Date(System.currentTimeMillis() + expiredMs))
            .signWith(secretKey)
            .compact();
}

}


- .get("username", String.class); -> 토큰이 검증되면 username을 string으로 반환
- .get("role", String.class); -> role을 string으로 반환
- getExpiration().before(new Date()); -> 현재 날짜가 소멸날짜 이전인지 계산해서 반환


- createJwt(String username, String role, Long expiredMs) : 토큰 생성
	- expiredMs : 토큰 유효기간
- .issuedAt(new Date(System.currentTimeMillis())) : 토큰 생성 날짜
- .expiration(new Date(System.currentTimeMillis() + expiredMs)) : 현재 날짜에 유효기간 더해서 토큰 소멸될 날짜 정하기
- .signWith(secretKey) : 시크릿키로 암호화
profile
스프링 공부기록🧾

0개의 댓글