본문 바로가기
카테고리 없음

Spring Boot와 JWT를 활용한 인증 시스템 구축

by blogger6915 2025. 3. 4.
반응형

JWT(JSON Web Token)은 웹 애플리케이션에서 사용자 인증을 위해 널리 사용되는 보안 방식입니다. Spring Boot와 함께 사용하면 강력한 인증 시스템을 구현할 수 있습니다.

JWT란?

JWT는 JSON 형식의 토큰을 사용하여 클라이언트와 서버 간 인증을 수행하는 방식입니다.

  • 무상태(Stateless) - 서버에서 세션을 유지할 필요 없음
  • 보안성 - 서명된 토큰을 사용하여 위변조 방지
  • 유연성 - API 인증, OAuth, 마이크로서비스 인증 등에 활용 가능

Spring Boot JWT 인증 시스템 구현

먼저, JWT를 사용하기 위해 spring-boot-starter-securityjjwt 라이브러리를 추가합니다.


<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.5</version>
</dependency>

JWT 생성 및 검증을 위한 유틸리티 클래스

JWT 토큰을 생성하고 검증하는 `JwtUtil` 클래스를 작성합니다.


import io.jsonwebtoken.*;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component
public class JwtUtil {
    private final String SECRET_KEY = "your_secret_key";
    private final long EXPIRATION_TIME = 1000 * 60 * 60; // 1시간

    public 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();
    }

    public String extractUsername(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

JWT 기반 인증 컨트롤러 구현

사용자가 로그인하면 JWT를 발급하는 API를 생성합니다.


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

@RestController
@RequestMapping("/auth")
public class AuthController {
    private final JwtUtil jwtUtil;

    public AuthController(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        if ("admin".equals(username) && "password".equals(password)) { // 간단한 예제 (실제 구현에서는 DB와 연동)
            return jwtUtil.generateToken(username);
        }
        return "Invalid credentials";
    }
}

Spring Security 설정

JWT를 활용한 사용자 인증을 Spring Security에 적용합니다.


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/auth/login").permitAll()
                .anyRequest().authenticated());
        return http.build();
    }
}

JWT 인증 테스트

애플리케이션을 실행한 후, Postman을 이용하여 다음 API를 테스트할 수 있습니다.

  • JWT 발급 (로그인): POST http://localhost:8080/auth/login (Body에 username, password 추가)
  • JWT를 포함한 API 호출: GET http://localhost:8080/protected (헤더에 `Authorization: Bearer {TOKEN}` 추가)

Spring Boot JWT 학습 추천 자료

  • 📌 JSON Web Token 공식 문서
  • 📌 Spring Boot + JWT 강의 (인프런, 유튜브)

마무리

Spring Boot와 JWT를 활용하면 보안성이 뛰어난 인증 시스템을 구축할 수 있습니다. Spring Security와 함께 사용하면 더욱 강력한 보안 기능을 적용할 수 있으며, API 기반의 서비스에서도 효율적인 인증이 가능합니다.

반응형