Spring Security JWT 인증 구현 하기 3편 (JWT 생성)

이영재·2024년 10월 28일
0

Spring

목록 보기
10/15

1. JWTUtil

JWTUtil 클래스는 JWT 토큰을 생성하고, 서명하며, 검증하는 기능을 제공한다.

Spring Security 필터와 함께 사용하면, JWT 기반 인증 시스템을 구현이 가능하다.

package com.team29.ArtifactV2.global.security.jwt;

import ...

@Component
public class JWTUtil {
    private final 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 category, String username, String role, Long expiredMs) {
        return Jwts.builder()
                .claim("category", category)
                .claim("username", username)
                .claim("role", role)
                .issuedAt(new Date(System.currentTimeMillis()))
                .expiration(new Date(System.currentTimeMillis() + expiredMs))
                .signWith(secretKey)
                .compact();
    }

    public String getCategory(String token) {
        return Jwts.parser().verifyWith(secretKey)
                .build()
                .parseSignedClaims(token)
                .getPayload()
                .get("category", String.class);
    }

}

클래스 필드 및 생성자

private final SecretKey secretKey;

public JWTUtil(@Value("${spring.jwt.secret}") String secret) {
    secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8),
            Jwts.SIG.HS256.key().build().getAlgorithm());
}
  • JWT 서명에 사용될 비밀 키를 저장하는 필드다.
  • 이 키는 토큰의 암호화 및 서명을 위해 사용된다.
  • 생성자:
    • @Value("${spring.jwt.secret}")를 통해 application.properties 또는 application.yml 파일에 설정된 비밀 키를 가져온다.
    • secretKey는 SecretKeySpec을 사용해 생성되며, HMAC-SHA256 알고리즘을 기반으로 비밀 키로 사용된다.

getUsername(String token)

public String getUsername(String token) {
    return Jwts.parser().verifyWith(secretKey)
            .build()
            .parseSignedClaims(token)
            .getPayload()
            .get("username", String.class);
}
  • JWT 토큰에서 사용자 이름(username) 추출:
    • 토큰을 파싱하여 "username"이라는 클레임(payload)을 추출한다.
    • 토큰의 서명을 secretKey를 사용해 검증하여 정상적인 토큰인지 확인하고, 그 후 username 값을 반환한다.

getRole(String token)

public String getRole(String token) {
    return Jwts.parser().verifyWith(secretKey)
            .build()
            .parseSignedClaims(token)
            .getPayload()
            .get("role", String.class);
}
  • JWT 토큰에서 사용자 역할(role) 추출:
    • "role"이라는 클레임을 추출하여 사용자의 권한 정보를 가져온다.
      이는 사용자 접근 제어와 권한 부여에 사용될 수 있다.

isExpired(String token)

public Boolean isExpired(String token) {
    return Jwts.parser().verifyWith(secretKey)
            .build()
            .parseSignedClaims(token)
            .getPayload()
            .getExpiration()
            .before(new Date());
}
  • JWT 토큰의 만료 여부 확인:
    • 토큰의 만료 시간을 검사하여 현재 시간과 비교한다.
    • 만료 시간이 현재 시간보다 이전이라면, true를 반환하여 토큰이 만료되었음을 나타낸다.
    • 유효한 토큰이라면 false를 반환한다.

createJwt()

public String createJwt(String category, String username, String role, Long expiredMs) {
    return Jwts.builder()
            .claim("category", category)
            .claim("username", username)
            .claim("role", role)
            .issuedAt(new Date(System.currentTimeMillis()))
            .expiration(new Date(System.currentTimeMillis() + expiredMs))
            .signWith(secretKey)
            .compact();
}
  • JWT 토큰 생성:
    • 클레임 정보:
      • category, username, role과 같은 사용자 정보를 클레임으로 설정하여 JWT 토큰을 만든다.
      • issuedAt: 토큰의 발급 시간을 설정한다.
      • expiration: 토큰 만료 시간을 설정한다.
      • expiredMs는 토큰 발급 시점으로부터 몇 밀리초 후에 만료되는지를 설정한다.
  • signWith(secretKey): 토큰을 서명하여, 이후 토큰 검증 시에 서명이 유효한지 확인할 수 있게 한다.
  • compact()를 통해 완성된 JWT 토큰 문자열을 생성하여 반환한다.

getCategory(String token)

public String getCategory(String token) {
    return Jwts.parser().verifyWith(secretKey)
            .build()
            .parseSignedClaims(token)
            .getPayload()
            .get("category", String.class);
}
  • JWT 토큰에서 카테고리(category) 추출:
    • 토큰의 "category" 클레임을 읽어와 토큰의 용도를 구분한다.
    • 예를 들어, "access" 토큰과 "refresh" 토큰을 구분할 때 사용할 수 있다.

0개의 댓글

관련 채용 정보