Spring Security와 JWT를 활용한 인증 및 인가
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의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.