[java] Spring Framework를 사용하여 인증 및 권한 부여 구현하기

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의 기능을 적절히 활용하여 안전한 웹 애플리케이션을 개발하는데 도움이 되길 바랍니다.