본문 바로가기
GD's IT Lectures : 기초부터 시리즈/스프링부트(Spring Boot) 기초부터 ~

[스프링 부트(SpringBoot)] 간단한 보안 적용

by GDNGY 2023. 5. 3.

7. 간단한 보안 적용

7.1. 스프링 시큐리티 소개

스프링 시큐리티는 자바 기반의 웹 애플리케이션에서 인증(Authentication)과 인가(Authorization) 기능을 쉽게 구현할 수 있는 프레임워크입니다. 스프링 부트와 함께 사용하면 기본 설정이 자동으로 적용되어 더욱 간편하게 사용할 수 있습니다. 인증은 사용자가 누구인지 확인하는 과정이며, 인가는 사용자가 특정 리소스에 대해 접근 권한이 있는지 확인하는 과정입니다. 

 

7.2. 기본 인증 및 인가 설정

스프링 부트에서 스프링 시큐리티를 사용하려면 먼저 의존성을 추가해야 합니다. pom.xml 파일이나 build.gradle 파일에 다음과 같이 의존성을 추가합니다.

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

 

기본적으로 스프링 시큐리티는 모든 요청에 대해 인증이 필요하도록 설정되어 있습니다. 그러나 이러한 설정은 프로젝트의 요구 사항에 따라 변경해야 할 수도 있습니다. 다음은 스프링 시큐리티의 기본 설정을 커스터마이징 하는 예입니다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/public/**").permitAll()
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

 

이 코드에서 @Configuration과 @EnableWebSecurity 어노테이션을 사용하여 이 클래스가 스프링 시큐리티 설정 클래스임을 나타냅니다. WebSecurityConfigurerAdapter를 상속받아 기본 설정을 오버라이딩할 수 있습니다.

 

configure(HttpSecurity http) 메서드에서 인증 및 인가 설정을 정의합니다. 위 예제에서는 "/", "/public/**" 경로는 모두 접근 가능하게 하고, 그 외 요청은 인증이 필요하도록 설정했습니다. 또한 로그인 및 로그아웃 설정도 정의하였습니다.

 

configure(AuthenticationManagerBuilder auth) 메서드에서 사용자 정보를 가져오는 방법을 정의하고, 암호화 방식을 설정합니다. 여기서 CustomUserDetailsService는 사용자 정보를 데이터베이스에서 가져오는 데 사용됩니다.

BCryptPasswordEncoder는 비밀번호를 암호화하는 데 사용되는 인코더입니다. 

 

이제 스프링 시큐리티를 사용하여 사용자 인증 및 인가를 처리하는 간단한 예제를 살펴보겠습니다.

 

  • CustomUserDetailsService를 구현합니다.
@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
    }
}

 

  • UserRepository를 생성합니다.
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

 

  • User 엔티티를 생성합니다.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;

    // Getters, setters, constructors 등 생략
}

 

이 예제에서는 사용자 인증을 위해 데이터베이스에서 사용자 정보를 가져옵니다. 이제 애플리케이션에 로그인 및 로그아웃 기능이 추가되었습니다.

 

 

2023.05.03 - [프로그래밍/스프링부트(Spring Boot) 기초부터 ~] - [스프링 부트(SpringBoot)] RESTful API 개발 기초

 

반응형

댓글