반응형
JWT(JSON Web Token)은 웹 애플리케이션에서 사용자 인증을 위해 널리 사용되는 보안 방식입니다. Spring Boot와 함께 사용하면 강력한 인증 시스템을 구현할 수 있습니다.
JWT란?
JWT는 JSON 형식의 토큰을 사용하여 클라이언트와 서버 간 인증을 수행하는 방식입니다.
- 무상태(Stateless) - 서버에서 세션을 유지할 필요 없음
- 보안성 - 서명된 토큰을 사용하여 위변조 방지
- 유연성 - API 인증, OAuth, 마이크로서비스 인증 등에 활용 가능
Spring Boot JWT 인증 시스템 구현
먼저, JWT를 사용하기 위해 spring-boot-starter-security
및 jjwt
라이브러리를 추가합니다.
<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 기반의 서비스에서도 효율적인 인증이 가능합니다.
반응형