SpringBoot

SpringBoot - JWT 구현 (기초)

hminor 2024. 11. 23. 22:38
반응형

JWT(Json Web Token)
- 서버와 클라이언트 간 인증 및 정보 교환을 위해 널리 사용되는 토큰 기반 인증 방식


1. 프로젝트 환경 설정

JWT를 구현하려면 필요한 라이브러리를 추가해야 합니다.

Maven 의존성 추가

pom.xml에 아래와 같은 의존성을 추가합니다.

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- JWT 라이브러리 -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-api</artifactId>
        <version>0.11.5</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-impl</artifactId>
        <version>0.11.5</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-jackson</artifactId>
        <version>0.11.5</version>
    </dependency>
</dependencies>

2. JWT 생성 및 검증

JWT는 크게 3부분으로 구성됩니다.

  • Header: 토큰의 타입과 서명 알고리즘 정보
  • Payload: 토큰에 담을 데이터
  • Signature: Header와 Payload를 암호화한 값

이제 JWT를 생성하고 검증하는 유틸리티 클래스를 만들어 보겠습니다.

JWT Utility Class

아래는 JWT를 생성하고 검증하는 JwtUtil 클래스입니다.

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;

import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "my-secret-key"; // 비밀 키
    private static final long EXPIRATION_TIME = 1000 * 60 * 60; // 1시간

    // JWT 생성 메서드
    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // JWT 검증 메서드
    public static Claims validateToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}

3. JWT를 활용한 API 구현

JWT 생성 및 검증 로직을 사용해 간단한 API를 구현합니다.

컨트롤러 구현

AuthController를 생성해 로그인과 사용자 정보를 반환하는 API를 만듭니다.

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/auth")
public class AuthController {

    // 로그인 시 JWT 발급
    @PostMapping("/login")
    public String login(@RequestParam String username) {
        // 실제로는 username과 password를 확인해야 함.
        // 여기서는 단순히 username으로 토큰 발급
        return JwtUtil.generateToken(username);
    }

    // JWT를 이용한 사용자 정보 확인
    @GetMapping("/user")
    public String getUserInfo(@RequestHeader("Authorization") String token) {
        // Bearer 토큰 형식에서 실제 토큰 부분만 추출
        token = token.replace("Bearer ", "");
        return JwtUtil.validateToken(token).getSubject();
    }
}

4. 실행 및 테스트

애플리케이션 실행

Spring Boot 애플리케이션을 실행합니다.

Postman으로 테스트

  1. JWT 발급 테스트
    • URL: POST http://localhost:8080/auth/login
    • Body: username 파라미터에 값을 입력.
    • 응답: JWT 토큰이 반환됩니다.
  2. JWT 검증 테스트
    • URL: GET http://localhost:8080/auth/user
    • Headers: Authorization에 Bearer {발급받은 토큰}을 추가.
    • 응답: 토큰에 포함된 사용자 이름(username)이 반환됩니다.

5. 이후

다음 포스팅으로는 아래 순서대로 작성하겠습니다 :)

 

  • 비밀번호 암호화 및 사용자 인증
  • JWT 필터를 활용한 전역 인증
  • 리프레시 토큰 구현