[스프링] 스프링 클라우드 시큐리티에서의 JWT(JSON Web Token)

스프링 시큐리티는 많은 인증 방식을 지원하지만, JWT(JSON Web Token)는 클라이언트와 서버 간의 효율적이고 간단한 인증을 가능하게 하는 인기 있는 방식 중 하나이다. 이 글에서는 스프링 클라우드 시큐리티에서 JWT를 사용하는 방법에 대해 알아보겠다.

JWT(JSON Web Token)란?

JWT(JSON Web Token)는 클레임(사용자에 대한 정보)을 안전하게 전달하기 위한 컴팩트하고 자체수익 발급 형식이다. JWT는 JSON 객체에 안전하게 정보를 저장하여 URL 파라미터, 헤더 또는 요청 바디에 포함될 수 있다.

스프링 클라우드 시큐리티에서의 JWT 구현

스프링 클라우드 시큐리티에서 JWT를 구현하기 위해 다음 단계를 따라할 수 있다.

1. 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 다음 추가 의존성은 클라이언트에서 JWT 생성 시 필요 -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2. 스프링 시큐리티 설정

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/api/public/**").permitAll()
            .anyRequest().authenticated();
    }
}

3. JWT 토큰 제공자 및 검증 설정

@Configuration
public class JwtConfig {

    @Bean
    public JwtProvider jwtProvider() {
        return new JwtProvider(secretKey, expirationTime);
    }

    @Bean
    public JwtAuthFilter jwtAuthFilter() {
        return new JwtAuthFilter(jwtProvider());
    }
}

4. 사용자 로그인 및 JWT 발급

@RestController
public class AuthController {

    @Autowired
    private JwtProvider jwtProvider;

    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestBody UserCredentials credentials) {
        // 사용자 인증
        // JWT 생성
        String token = jwtProvider.generateToken(userDetails);
        return ResponseEntity.ok(token);
    }
}

5. JWT 검증 및 사용자 인가

public class JwtAuthFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = extractTokenFromRequest(request);
        if (token != null && jwtProvider.validateToken(token)) {
            // 사용자 인가
            // 요청 처리
        } else {
            // 인증 오류 처리
        }
    }
}

위와 같이 스프링 클라우드 시큐리티에서 JWT를 구현할 수 있다. JWT를 사용함으로써 인증 및 권한 부여 과정이 간편해지고, 다양한 플랫폼 간에도 유연하게 사용할 수 있다.

참고 자료:

이렇게 스프링 클라우드 시큐리티에서의 JWT를 사용하는 방법에 대해 알아보았다.

부족한 부분이 있거나 추가 내용이 필요하다면 지적해주시기 바랍니다. 감사합니다!