Spring Framework는 웹 애플리케이션 개발에 매우 유용한 자바 프레임워크입니다. 이를 사용하여 사용자 인증 및 권한 부여 기능을 구현하는 방법을 알아보겠습니다.
1. Spring Security 설정
Spring Security는 Spring Framework의 인증 및 권한 부여 프레임워크로, 다양한 인증 방식과 권한 부여 메커니즘을 제공합니다. 우선 프로젝트에 Spring Security를 추가해야 합니다.
pom.xml 파일에 다음 의존성을 추가합니다:
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
...
</dependencies>
2. 사용자 인증 구현하기
Spring Security는 기본적으로 사용자 인증을 위한 UserDetailsService
인터페이스를 제공합니다. 이 인터페이스를 구현하여 사용자 정보를 반환하는 서비스를 만들어보겠습니다.
@Service
public class UserDetailsServiceImpl 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("Invalid username or password");
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user));
}
private List<GrantedAuthority> getAuthorities(User user) {
// 사용자에게 할당된 권한을 가져와서 리스트로 변환합니다.
return user.getRoles().stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.collect(Collectors.toList());
}
}
위에서 UserDetailsService
를 구현한 UserDetailsServiceImpl
클래스에서는 사용자명에 해당하는 사용자를 데이터베이스에서 찾고, 찾은 사용자의 정보와 권한을 User
객체로 변환하여 반환합니다.
3. 인증 처리하기
Spring Security는 사용자 인증 요청을 처리하기 위해 AuthenticationManager
인터페이스를 사용합니다. 애플리케이션에서는 이 인터페이스를 이용하여 사용자의 인증을 처리하는 로직을 구현해야 합니다.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated()
.and()
.formLogin();
}
}
위 코드에서는 WebSecurityConfig
클래스에서 configure()
메소드를 오버라이딩하여 인증 및 권한 부여를 설정합니다. authorizeRequests()
를 사용하여 URL 패턴별로 접근 권한을 설정하고, formLogin()
을 사용하여 로그인 페이지를 설정합니다.
4. 사용자 권한 부여하기
마지막으로, 데이터베이스에 등록된 사용자의 권한 정보를 확인하여 접근 제어를 구현해야 합니다. 이를 위해 @PreAuthorize
어노테이션을 사용할 수 있습니다.
@RestController
@RequestMapping("/api")
public class ApiController {
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String adminOnly() {
return "Admin Only";
}
@PreAuthorize("hasAnyRole('ADMIN', 'USER')")
@GetMapping("/user")
public String userOnly() {
return "User Only";
}
}
위 코드에서는 @PreAuthorize
어노테이션을 사용하여 해당 메소드의 실행 전에 사용자의 권한을 확인하고, 권한에 따라 접근 여부를 결정합니다.
참고 및 참조
이제 Spring Framework를 사용하여 인증 및 권한 부여 기능을 구현하는 방법에 대해 알아보았습니다. Spring Security의 기능을 적절히 활용하여 안전한 웹 애플리케이션을 개발하는데 도움이 되길 바랍니다.