본문 바로가기

Spring Boot

[Spring Boot] JWT 사용하기

728x90

JWT 의존성 설정 및 토큰 발행하기

이 가이드는 Spring 애플리케이션에서 JWT를 사용하기 위한 의존성 설정과 JWT 토큰을 생성하고 검증하는 방법을 설명합니다. JWT(JSON Web Token)는 클라이언트와 서버 간의 인증 정보를 안전하게 전송하기 위해 사용됩니다.

 

1. JWT 의존성 설정하기

JWT를 사용하기 위해 필요한 의존성을 추가합니다.

  • Gradle 설정: build.gradle 파일에 아래 코드를 추가하세요.
dependencies {
    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' // JSON 처리 라이브러리
}
  • 의존성을 추가한 후 Gradle 동기화를 통해 라이브러리를 다운로드합니다.

 

2. JWT 토큰 발행하기

JWT 토큰을 생성하기 위한 TokenService 클래스를 작성합니다. 이 클래스는 JWT를 생성하고 검증하는 기능을 제공합니다.

TokenService 클래스 코드

@Slf4j
@Service
public class TokenService {

    private static final String mySecretKey = "SuperSecretKeyForJWT123456789";

    public String generateToken(Map<String, Object> claims, LocalDateTime expirationTime) {
        var key = Keys.hmacShaKeyFor(mySecretKey.getBytes());

        // LocalDateTime -> Date로 변환
        var tokenExpiration = Date.from(expirationTime.atZone(ZoneId.systemDefault()).toInstant());

        return Jwts.builder()
                    .signWith(key, SignatureAlgorithm.HS256) // 서명 알고리즘 설정
                    .setClaims(claims) // 클레임 설정
                    .setExpiration(tokenExpiration) // 만료일 설정
                    .compact(); // JWT 생성
    }

    public void verifyToken(String token) {
        var key = Keys.hmacShaKeyFor(mySecretKey.getBytes());

        var parser = Jwts.parserBuilder()
                .setSigningKey(key)
                .build();

        // JWT 검증
        var parsedClaims = parser.parseClaimsJws(token);
        
        parsedClaims.getBody().forEach((key1, value1) -> 
            log.info("key : {}, value : {}", key1, value1)); // 검증된 클레임 로그 출력
    }
}

 

  • generateToken 메서드: 클레임과 만료 시간을 인자로 받아 JWT를 생성합니다.
    • claims: 사용자 ID와 같은 정보가 포함됩니다.
    • expirationTime: JWT의 만료 시간을 설정합니다.
  • verifyToken 메서드: JWT의 유효성을 검사하고, 성공하면 클레임 정보를 로그에 출력합니다.

 

3. JWT 토큰 테스트하기

JWT 토큰을 생성하고 검증하기 위해 JUnit 테스트 클래스를 작성합니다.

JwtTokenTests 클래스 코드

@SpringBootTest
class JwtTokenTests {

    @Autowired
    private TokenService tokenService;

    @Test
    void contextLoads() {
    }

    @Test
    void createToken() {
        var claims = new HashMap<String, Object>();
        claims.put("user_id", 123); // 클레임 정보 추가

        var expirationTime = LocalDateTime.now().plusMinutes(15); // 15분 후 만료

        var jwtToken = tokenService.generateToken(claims, expirationTime); // JWT 생성

        System.out.println(jwtToken); // 생성된 JWT 출력
    }

    @Test
    void validateToken() {
        var token = "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTY4MTg1NDEyNn0.Gz21W0x-Kb1ICw7Ha18dDP3tL5fb5SBXYrTjMdKdlJ8"; // 예시 토큰
        tokenService.verifyToken(token); // 토큰 검증
    }
}

 

 

  • createToken 메서드: JWT 토큰을 생성하고 출력합니다. 사용자의 ID를 클레임에 추가하고, 만료 시간을 15분으로 설정합니다.
  • validateToken 메서드: 특정 JWT 토큰을 검증합니다. 이 예시에서는 미리 준비된 JWT를 사용하여 검증합니다.

 

 

4. 유효 시간 변경하여 성공 실패 확인하기

JWT의 유효 시간을 변경하여 토큰이 만료되었을 때와 유효할 때의 동작을 확인할 수 있습니다. 유효 시간이 지난 토큰을 검증하려고 하면 예외가 발생해야 하며, 이를 통해 유효성 검사를 진행할 수 있습니다.

@Test
void expiredTokenValidation() {
    var expiredToken = "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo5MjUsImV4cCI6MTY4MTg1NDEyNn0.Gz21W0x-Kb1ICw7Ha18dDP3tL5fb5SBXYrTjMdKdlJ8"; // 만료된 JWT
    try {
        tokenService.verifyToken(expiredToken); // 만료된 토큰 검증
    } catch (Exception e) {
        log.error("토큰이 만료되었습니다: {}", e.getMessage()); // 예외 처리
    }
}

 

 

 

5. 마무리

위 단계를 통해 Spring 애플리케이션에서 JWT를 사용하여 사용자 인증 및 정보를 안전하게 관리할 수 있습니다. JWT는 상태 비저장 방식으로 작동하므로 서버의 부담을 줄이고, 클라이언트 측에서 간편하게 관리할 수 있습니다.

다음 단계로는 JWT를 Spring Security와 통합하여 사용자 인증 및 권한 부여를 구현할 수 있습니다.

728x90