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 개발 기초
'GD's IT Lectures : 기초부터 시리즈 > 스프링부트(Spring Boot) 기초부터 ~' 카테고리의 다른 글
[스프링 부트(SpringBoot)] 기본 배포 및 모니터링 (0) | 2023.05.03 |
---|---|
[스프링 부트(SpringBoot)] 테스트 기초 (0) | 2023.05.03 |
[스프링 부트(SpringBoot)] RESTful API 개발 기초 (0) | 2023.05.03 |
[스프링 부트(SpringBoot)] 웹 개발 기초 (0) | 2023.05.03 |
[스프링 부트(SpringBoot)] 데이터베이스 연동 기초 (0) | 2023.05.03 |
댓글