본문 바로가기

기술 학습

스프링 시큐리티(Spring Security) 기본 개념과 설정 방법

728x90

스프링 시큐리티(Spring Security)는 스프링 기반 애플리케이션의 보안을 강화하는 강력한 프레임워크입니다. 이번 글에서는 스프링 시큐리티의 기본 개념과 설정 방법을 알아보겠습니다.


1. 스프링 시큐리티란?

스프링 시큐리티는 인증(Authentication)과 인가(Authorization)를 관리하는 보안 프레임워크입니다. 주요 기능은 다음과 같습니다:

  • 사용자 인증 (로그인)
  • 권한 관리 (인가)
  • CSRF 보호
  • 세션 관리
  • OAuth2 및 JWT 지원

2. 스프링 시큐리티 기본 설정

스프링 부트(Spring Boot)를 활용하면 시큐리티 설정이 간단해집니다.

2.1. 기본 의존성 추가

먼저, spring-boot-starter-security를 추가합니다.

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

이제 기본 로그인 페이지가 활성화되며, user 계정과 콘솔에 출력된 비밀번호로 접근할 수 있습니다.


3. 사용자 정의 설정

기본 설정이 아닌, 직접 사용자 정보를 정의하는 방법을 살펴보겠습니다.

3.1. SecurityConfig 클래스 생성

Spring Security의 설정을 커스터마이징하려면 @Configuration@EnableWebSecurity를 사용하여 설정 클래스를 만듭니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/admin").hasRole("ADMIN")
                .requestMatchers("/user").hasRole("USER")
                .anyRequest().authenticated()
            )
            .formLogin()
            .and()
            .logout();
        return http.build();
    }
}

이 설정을 적용하면:

  • /admin 경로는 ADMIN 역할을 가진 사용자만 접근 가능
  • /user 경로는 USER 역할을 가진 사용자만 접근 가능
  • 그 외 요청은 인증된 사용자만 접근 가능

3.2. 사용자 계정 추가

기본 사용자 정보를 설정하려면 UserDetailsService를 사용합니다.

@Bean
public UserDetailsService userDetailsService() {
    UserDetails user = User.withDefaultPasswordEncoder()
        .username("user")
        .password("password")
        .roles("USER")
        .build();

    UserDetails admin = User.withDefaultPasswordEncoder()
        .username("admin")
        .password("admin")
        .roles("ADMIN")
        .build();

    return new InMemoryUserDetailsManager(user, admin);
}

이 설정을 적용하면:

  • user 계정은 USER 역할을 가짐
  • admin 계정은 ADMIN 역할을 가짐
  • 비밀번호는 단순한 예제를 위해 인코딩 없이 설정됨 (실제 환경에서는 비밀번호 인코딩 필요)

4. JWT(JSON Web Token) 인증 적용

JWT를 활용한 인증 방식은 REST API에서 많이 사용됩니다. 기본적인 JWT 설정 방법은 다음과 같습니다.

4.1. JWT 의존성 추가

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

4.2. JWT 토큰 생성 및 검증 로직

import io.jsonwebtoken.*;
import java.util.Date;

public class JwtUtil {
    private static final String SECRET_KEY = "mySecretKey";

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

    public static Claims validateToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}

이렇게 하면 사용자 로그인 시 JWT를 발급하고, 이후 요청에서 이를 검증하여 보안성을 높일 수 있습니다.


5. 결론

스프링 시큐리티를 활용하면 강력한 인증 및 권한 관리를 손쉽게 구현할 수 있습니다. 기본적인 로그인 설정부터, 커스텀 보안 설정, JWT 인증 방식까지 활용하여 프로젝트에 맞는 보안 기능을 적용해 보세요!

728x90