JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ

// JWT ํ† ํฐ ์ƒ์„ฑ
public String createAccessToken(Long userId, Role role, String tenantId) {
    Map<String, Object> claims = new HashMap<>();
    claims.put("userId", userId);
    claims.put("role", role.name());
    claims.put("tenantId", tenantId);

    return Jwts.builder()
        .claims(claims)
        .signWith(getSigningKey(), Jwts.SIG.HS256)
        .compact();
}

๊ณ„์ • ์ž ๊ธˆ (๋กœ๊ทธ์ธ ์‹œ๋„ ์ œํ•œ)

// Refresh Token Rotation
public LoginResult refreshToken(String refreshToken) {
    Long userId = jwtTokenService.validateAndGetUserIdFromRefreshToken(refreshToken);

    // ์ƒˆ๋กœ์šด ํ† ํฐ ์Œ ์ƒ์„ฑ
    String newAccessToken = jwtTokenService.createAccessToken(userId, userRole, null);
    String newRefreshToken = jwtTokenService.createRefreshToken(userId);

    // ๊ธฐ์กด ํ† ํฐ์„ ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ๊ต์ฒด
    saveOrUpdateRefreshToken(userId, newRefreshToken);

    return LoginResult.builder()
        .accessToken(newAccessToken)
        .refreshToken(newRefreshToken)
        .build();
}

๊ถŒํ•œ ๋ ˆ๋ฒจ ๊ด€๋ฆฌ

// ๊ถŒํ•œ ์ฒด๊ณ„
public enum Role {
    USER("์ผ๋ฐ˜์‚ฌ์šฉ์ž"),
    ADMIN("๊ด€๋ฆฌ์ž");

    public boolean hasPermission(Role requiredRole) {
        return this.ordinal() >= requiredRole.ordinal();
    }

    public boolean isAdmin() {
        return this.ordinal() >= ADMIN.ordinal();
    }
}

๋งˆ์ง€๋ง‰ ๋กœ๊ทธ์ธ ์‹œ๊ฐ„ ์ถ”์ 