F-Lab
🚀
상위권 IT회사 합격 이력서 무료로 모아보기

Spring Security와 JWT를 활용한 인증 및 인가

writer_thumbnail

F-Lab : 상위 1% 개발자들의 멘토링

AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!



Spring Security와 JWT의 중요성

현대 웹 애플리케이션에서는 보안이 매우 중요합니다. 특히, 인증 및 인가 과정은 사용자 데이터를 보호하고, 시스템의 무결성을 유지하는 데 필수적입니다.

Spring Security는 스프링 프레임워크에서 제공하는 강력한 보안 프레임워크로, 다양한 인증 및 인가 기능을 제공합니다. JWT(Json Web Token)는 토큰 기반 인증 방식으로, 사용자 정보를 안전하게 전달할 수 있습니다.

왜냐하면 Spring Security와 JWT는 웹 애플리케이션의 보안을 강화하는 데 중요한 역할을 하기 때문입니다.

이 글에서는 Spring Security와 JWT를 활용한 인증 및 인가 방법에 대해 알아보겠습니다.

이를 통해 웹 애플리케이션의 보안을 강화할 수 있는 방법을 배울 수 있습니다.



Spring Security 설정

Spring Security를 설정하는 첫 번째 단계는 의존성을 추가하는 것입니다. Maven을 사용하는 경우, pom.xml 파일에 다음과 같이 의존성을 추가할 수 있습니다.


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

왜냐하면 Spring Security는 스프링 부트 프로젝트에서 쉽게 통합할 수 있는 보안 프레임워크이기 때문입니다.

그 다음으로, 보안 설정 클래스를 작성해야 합니다. 이 클래스는 WebSecurityConfigurerAdapter를 상속받아야 합니다.


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/api/auth/**").permitAll()
            .anyRequest().authenticated();
    }
}

이렇게 하면 기본적인 보안 설정이 완료됩니다.



JWT 설정

JWT를 사용하려면 JWT 라이브러리를 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음과 같이 의존성을 추가할 수 있습니다.


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

왜냐하면 JWT는 토큰 기반 인증 방식을 제공하여 사용자 정보를 안전하게 전달할 수 있기 때문입니다.

그 다음으로, JWT 토큰을 생성하고 검증하는 유틸리티 클래스를 작성해야 합니다.


public class JwtUtil {
    private String secretKey = "secret";

    public String generateToken(String username) {
        return Jwts.builder()
            .setSubject(username)
            .setIssuedAt(new Date())
            .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
            .signWith(SignatureAlgorithm.HS256, secretKey)
            .compact();
    }

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

이렇게 하면 JWT 토큰을 생성하고 검증할 수 있습니다.



Spring Security와 JWT 통합

Spring Security와 JWT를 통합하려면 JWT 필터를 추가해야 합니다. 이 필터는 요청이 들어올 때마다 JWT 토큰을 검증합니다.


public class JwtFilter extends OncePerRequestFilter {
    @Autowired
    private JwtUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        String authorizationHeader = request.getHeader("Authorization");

        String token = null;
        String username = null;

        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            token = authorizationHeader.substring(7);
            username = jwtUtil.extractUsername(token);
        }

        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            UserDetails userDetails = userDetailsService.loadUserByUsername(username);

            if (jwtUtil.validateToken(token, userDetails)) {
                UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =
                        new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
            }
        }
        filterChain.doFilter(request, response);
    }
}

왜냐하면 JWT 필터는 요청이 들어올 때마다 JWT 토큰을 검증하여 보안을 강화하기 때문입니다.

그 다음으로, 보안 설정 클래스에 JWT 필터를 추가해야 합니다.


@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/api/auth/**").permitAll()
        .anyRequest().authenticated()
        .and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
}

이렇게 하면 Spring Security와 JWT를 통합할 수 있습니다.



결론

Spring Security와 JWT는 웹 애플리케이션의 보안을 강화하는 데 중요한 역할을 합니다. 이 두 기술을 활용하면 사용자 데이터를 안전하게 보호할 수 있습니다.

Spring Security를 설정하는 첫 번째 단계는 의존성을 추가하는 것입니다. 그 다음으로, 보안 설정 클래스를 작성해야 합니다.

JWT를 사용하려면 JWT 라이브러리를 추가하고, JWT 토큰을 생성하고 검증하는 유틸리티 클래스를 작성해야 합니다.

Spring Security와 JWT를 통합하려면 JWT 필터를 추가하고, 보안 설정 클래스에 JWT 필터를 추가해야 합니다.

이 글을 통해 Spring Security와 JWT를 활용한 인증 및 인가 방법에 대해 알아보았습니다. 이 글이 여러분의 웹 애플리케이션 보안을 강화하는 데 도움이 되길 바랍니다.

ⓒ F-Lab & Company

이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.

조회수
logo
copyright © F-Lab & Company 2025