스프링 Spring
22. Spring Security에서 RBAC(Role-Based Access Control) 적용
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring

포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. RBAC(Role-Based Access Control)란?
✔ RBAC(역할 기반 접근 제어)는 사용자에게 역할(Role)을 부여하고, 해당 역할에 따라 접근 권한을 제한하는 방식
✔ 관리자가 직접 사용자의 권한을 부여하는 방식보다 더 체계적인 접근 제어 가능
📌 RBAC의 주요 특징
역할(Role) 기반 권한 부여 | 사용자가 직접 리소스에 접근하는 것이 아니라 역할을 통해 접근 |
관리 효율성 향상 | 개별 사용자별 권한 설정 대신 역할을 부여하여 관리 |
보안 강화 | 권한이 필요한 기능을 역할로 구분하여 불필요한 접근 방지 |
기업 및 조직에서 필수 | 금융, 의료, 정부 기관 등 보안이 중요한 환경에서 필수 적용 |
📌 RBAC을 적용하면 "보안성이 강화되고 권한을 체계적으로 관리 가능"
2. 기존 권한 관리 방식 vs RBAC 비교
✔ RBAC 없이 개별 사용자에게 권한을 부여하면 관리가 어렵고 보안성이 낮음
📌 권한 관리 방식 비교
권한 부여 대상 | 개별 사용자(User) | 역할(Role) |
관리 방식 | 사용자별 권한 직접 설정 | 역할에 권한을 부여하고, 사용자에게 역할 할당 |
보안성 | 관리 복잡, 보안 취약 | 체계적인 접근 제어 가능 |
예제 | 특정 사용자(user1)에게 READ 권한 부여 | ADMIN 역할에게 READ, WRITE 권한 부여 |
📌 RBAC을 활용하면 "대규모 시스템에서 보안과 권한 관리를 쉽게 할 수 있음"
✅ 여기까지 RBAC의 개념과 필요성을 배웠습니다!
👉 "그렇다면, Spring Security에서 RBAC을 어떻게 적용할까?"
✅ 2부에서 Spring Security를 활용한 RBAC(Role-Based Access Control) 구현 방법을 배워봅시다!
2. 상세 주제 정리
1. Spring Boot 프로젝트에 Spring Security 추가
✔ RBAC을 적용하려면 spring-boot-starter-security 의존성을 추가해야 함
📌 1️⃣ build.gradle 설정
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
✔ Spring Security를 추가하여 인증 및 권한 관리를 활성화
2. 역할(Role) 기반 RBAC 설정 (SecurityConfig 설정)
✔ Spring Security에서 역할(Role)에 따라 접근 권한을 제한 가능
📌 SecurityConfig 설정 – 역할(Role) 기반 접근 제어
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // CSRF 보호 비활성화
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN") // 관리자 페이지
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN") // 일반 사용자 및 관리자 접근 가능
.anyRequest().authenticated()
)
.formLogin(form -> form.defaultSuccessUrl("/home", true))
.logout(logout -> logout.logoutSuccessUrl("/login"));
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin123")
.roles("ADMIN")
.build();
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("user123")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(admin, user);
}
}
✔ /admin/** 경로는 ADMIN 역할만 접근 가능
✔ /user/** 경로는 USER, ADMIN 역할이 접근 가능
✔ 기본적으로 admin과 user 계정을 메모리에 저장(InMemoryUserDetailsManager)
📌 RBAC을 적용하면 "각 역할(Role)별로 권한을 다르게 설정 가능"
3. REST API에서 RBAC 적용 (Controller)
✔ Spring Security에서 역할(Role)에 따라 API 접근을 제한 가능
📌 RBAC 적용된 컨트롤러 예제
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class RoleBasedAccessController {
@GetMapping("/user")
public String userEndpoint() {
return "USER 권한이 필요한 페이지입니다.";
}
@GetMapping("/admin")
public String adminEndpoint() {
return "ADMIN 권한이 필요한 페이지입니다.";
}
}
✔ /api/user → USER, ADMIN 역할 접근 가능
✔ /api/admin → ADMIN 역할만 접근 가능
📌 RBAC을 적용하면 "각 API 엔드포인트에 대한 접근 권한을 세분화 가능"
4. RBAC을 데이터베이스(DB) 기반으로 적용하기
✔ JPA를 사용하여 사용자 및 역할(Role)을 DB에서 관리 가능
📌 User 엔티티 생성 (JPA 기반 RBAC 적용)
import jakarta.persistence.*;
import java.util.Set;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@ElementCollection(fetch = FetchType.EAGER)
private Set<String> roles; // ROLE_USER, ROLE_ADMIN 등 저장
// Getter & Setter
}
✔ 각 사용자는 여러 개의 역할(Role)을 가질 수 있음
📌 UserRepository – 사용자 조회 기능 추가
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
✔ 사용자의 역할(Role)을 DB에서 관리 가능
✅ 여기까지 Spring Security에서 RBAC(Role-Based Access Control) 적용 방법을 배웠습니다!
👉 "그렇다면, Spring Boot에서 Multi-Tenancy 아키텍처 구현은 어떻게 할까?"
✅ 다음 회차에서 Spring Boot에서 Multi-Tenancy 아키텍처 구현을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <26. JPA + QueryDSL을 활용한 복잡한 쿼리 최적화> (0) | 2025.04.12 |
---|---|
Spring 기초 <25. Spring Boot에서 GraphQL API 개발 (Spring GraphQL)> (0) | 2025.04.11 |
Spring 기초 <24. Spring Boot에서 Kafka 이벤트 스트리밍 시스템 구축> (0) | 2025.04.10 |
Spring 기초 <23. Spring Boot에서 Multi-Tenancy 아키텍처 구현> (0) | 2025.04.09 |
Spring 기초 <21. Spring Boot에서 웹소켓(WebSocket)과 실시간 데이터 처리> (1) | 2025.04.07 |
Spring 기초 <20. Spring WebFlux와 비동기 프로그래밍 (Reactor, Mono, Flux 개념)> (1) | 2025.04.06 |
Spring 기초 <19. Spring Boot에서 API Gateway 및 Rate Limiting 설정 (Rate Limiter)> (0) | 2025.04.05 |
Spring 기초 <18. OAuth2.0 인증 및 소셜 로그인(Google, Facebook, GitHub) 적용> (0) | 2025.04.04 |