IT Developer/Spring

Spring 기초 <22. Spring Security에서 RBAC(Role-Based Access Control) 적용>

TEMA_ 2025. 4. 8. 13:13
반응형

스프링 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 없이 개별 사용자에게 권한을 부여하면 관리가 어렵고 보안성이 낮음

📌 권한 관리 방식 비교

비교 항목기존 권한 관리 방식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 아키텍처 구현을 배워봅시다!



 

반응형