GDG on Campus Backend-Spring 스터디 WIL
Week 08 - 스프링 시큐리티 및 OAuth2 통합
정보에 대한 접근 권한을 역할에 따라 결정.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasRole( "USER")
.anyRequest().authenticated()
.and()
.formLogin()
// Specify the URL for the registration page
.and()
.logout().logoutSuccessUrl("/").permitAll();
return http.build();
}
}
@Configuration
public class UserDetailsConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public UserDetailsManager userDetailsManager() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(
User.withUsername("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN")
.build()
);
manager.createUser(
User.withUsername("user")
.password(passwordEncoder().encode("user"))
.roles("USER")
.build()
);
return manager;
}
}
RBAC를 서비스 계층으로 확장한 방식.
@Configuration
클래스에서 @EnableMethodSecurity
활성화 필요
@Configuration
@EnableMethodSecurity
public class SecurityConfig {
// Other security configurations here
}
@PreAuthorize
: 메소드 실행 전 권한 체크
@PreAuthorize("hasRole('ROLE_ADMIN') or (hasRole('ROLE_USER') and #userId == principal.userId)")
public void updateUser(int userId) {
// Method logic here
}
@PostAuthorize
: 메소드 실행 후 반환값에 따라 접근 제어
@Secured
: 특정 역할 기반으로 접근 제어
@Secured("ROLE_ADMIN")
public void deleteUser(int userId) {
// Method logic here
}
개별 리소스에 대한 접근을 세분화하여 정의 및 관리
hasPermission()
을 통해 접근성 관리 DB화spring-security-acl
라이브러리 제공)ACL_CLASS
: 도메인 객체의 종류
ACL_SID
: 권한의 주체가 되는 사용자 정보 & Role 정보
ACL_OBJECT_IDENTITY
: 보안의 대상이 되는 정보 객체
ACL_ENTRY
: 접근 권한 정보
인터넷 사용자가 애플리케이션에 직접 비밀번호를 제공하지 않고, 권한을 위임하여 리소스에 접근하도록 하는 프로토콜
기본이 되는 방식
간편 로그인에서 많이 사용
권한 부여 승인을 위해 자체 생성한 Authorization Code 를 전달하는 방식으로 많이 쓰임
자격증명을 안전하게 저장하기 힘든 클라이언트(ex. 자바스크립트 등의 스크립트언어 없이 사용한 브라우저)에게 최적화된 방식
권한 부여 승인 코드 없이 바로 Access Token 발급
응답성과 효율성은 높아지지만 Access Token이 URL로 전달된다는 단점 존재
username, password로 Access_Token을 받는 방식
권한서버, 리소스 서버, 클라이언트가 모두 같은 시스템에 있을 때 사용
클라이언트의 자격증명만으로 Access Token 획득하는 가장 간단한 방식
자신이 관리하는 리소스 혹은 권한 서버에 해당 클라이언트를 위한 제한된 리소스 접근 권한이 설정되어 있는 경우 사용
SecurityConfig
클래스에서 리소스 서버의 보안 구성 정의장점