JSON Web Token(JWT)은 웹 표준 (RFC 7519)으로, 두 개체 사이에서 JSON 객체를 사용하여 안전하게 정보를 전송하기 위한 컴팩트하고 자가 포함된 방식입니다. Spring Security와 JWT를 결합하면, RESTful API를 보호하는 데 필요한 강력하고 유연한 인증 및 인가 메커니즘을 구현할 수 있습니다. 이 글에서는 Spring Security와 JWT를 활용한 인증 및 인가 프로세스의 구현 방법에 대해 살펴보겠습니다.
JWT 인증 흐름
- 사용자 로그인: 사용자는 로그인 정보(일반적으로 사용자 이름과 비밀번호)를 제공합니다.
- 인증 및 토큰 발급: 서버는 사용자의 인증 정보를 검증하고, 인증이 성공하면 JWT를 생성하여 클라이언트에 반환합니다.
- JWT 사용: 클라이언트는 이후의 모든 요청에 JWT를 포함시켜 서버에 전송합니다.
- 서버에서의 JWT 검증: 서버는 요청과 함께 전송된 JWT를 검증하고, 유효한 토큰인 경우 요청된 작업을 수행합니다.
JWT 구성 요소
- Header: 토큰의 타입(JWT)과 해싱 알고리즘(예: HMAC SHA256)을 지정합니다.
- Payload: 클레임(토큰에 대한 정보, 사용자 정보 등)을 포함합니다.
- Signature: 토큰의 유효성을 검증하기 위해 사용됩니다.
Spring Security와 JWT 통합 구현
1. 의존성 추가
pom.xml에 Spring Security와 JWT를 처리하기 위한 의존성을 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2. JWT 토큰 생성 및 검증 서비스 구현
JWT 토큰을 생성하고 검증하는 서비스를 구현합니다. 이 서비스는 사용자 인증 후 토큰을 생성하고, 요청에 포함된 토큰의 유효성을 검증하는 역할을 합니다.
@Service
public class JwtTokenProvider {
private final String secretKey = "secret";
// JWT 토큰 생성
public String createToken(String username, List<String> roles) {
Claims claims = Jwts.claims().setSubject(username);
claims.put("roles", roles);
Date now = new Date();
Date validity = new Date(now.getTime() + 3600000); // 1시간 유효
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(now)
.setExpiration(validity)
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
// JWT 토큰 검증
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
return true;
} catch (JwtException | IllegalArgumentException e) {
throw new CustomException("Expired or invalid JWT token", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
3. Spring Security 구성
Spring Security 설정을 커스터마이징하여 JWT 인증 메커니즘을 적용합니다. 사용자 인증 정보를 검증한 후 JWT 토큰을 발급하고, 요청에 포함된 JWT를 검증하는 필터를 추가합니다.
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtTokenProvider jwtTokenProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().disable()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/login").permitAll()
.anyRequest().authenticated()
.and()
.apply(new JwtConfigurer(jwtTokenProvider));
}
}
여기서 JwtConfigurer는 JWT 검증을 수행하는 필터를 Spring Security 필터 체인에 등록하는 커스텀 DSL입니다.
결론
Spring Security와 JWT를 통합하여 사용함으로써, RESTful API 보안을 강화할 수 있습니다. 이 방식은 서버와 클라이언트 간에 안전한 인증 정보의 전달을 가능하게 하며, 애플리케이션의 보안을 강화하는 데 중요한 역할을 합니다. 구현된 JWT 인증 및 인가 메커니즘은 애플리케이션에 효과적인 보안 솔루션을 제공합니다.
'Spring' 카테고리의 다른 글
Spring Security를 이용한 소셜 로그인 구현 가이드 (26) | 2024.03.26 |
---|---|
멀티팩터 인증(MFA)을 위한 Spring Security 전략 (25) | 2024.03.25 |
Spring Security와 OAuth 2.0을 통한 현대적 인증 및 인가 전략 (25) | 2024.03.25 |
Spring Security를 활용한 RESTful API 보안 전략 (22) | 2024.03.24 |
Spring Boot와 Spring Security: 강력한 보안 솔루션을 위한 완벽한 통합 (22) | 2024.03.24 |