[Spring Security] Role Hierarchy: ๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ ๊ฐœ๋… ์ •๋ฆฌ & ์ ์šฉ

2025. 5. 22. 15:03ยท๐ŸŒฟSpring

๋“ค์–ด๊ฐ€๋ฉด์„œ

 

๊ธฐ์กด์˜ ๋””์Šค์ฝ”๋“œ์ž‡ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ด€๋ฆฌ์ž, ์œ ์ € ๊ตฌ๋ถ„ ์—†์ด

๋กœ๊ทธ์ธํ•˜๋ฉด ๋ˆ„๊ตฌ๋‚˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ๋ฏธ์…˜์—์„œ role์„ ์ •์˜ํ•˜๊ณ , role์— ๋”ฐ๋ผ ํ–‰๋™์„ ์ œํ•œํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ์ด๋ฅผ ์ฝ”๋“œ์— ์ ์šฉํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


๊ฐœ๋ฐœ ํ™˜๊ฒฝ

Spring Boot 3.4.0

Spring Security 6.4.1


๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ Role Hierarchy

Spring Security์˜ ๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ(Role Hierarchy) ๋Š” ์—ญํ• (Role) ๊ฐ„์˜ ํฌํ•จ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํšŒ์‚ฌ์—์„œ ์‚ฌ์žฅ์ด ๋ถ€์žฅ์˜ ๋ชจ๋“  ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ , ๋ถ€์žฅ์ด ์‚ฌ์›์˜ ๊ถŒํ•œ์„ ๋ชจ๋‘ ๊ฐ€์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ,
๋” ๋†’์€ ์—ญํ• ์ด ๋” ๋‚ฎ์€ ์—ญํ• ์˜ ๊ถŒํ•œ์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์™œ Role Hierarchy์ธ๋ฐ "์—ญํ•  ๊ณ„์ธต ๊ตฌ์กฐ"๊ฐ€ ์•„๋‹ˆ๊ณ  "๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ"๋ผ๊ณ  ๋ถ€๋ฅผ๊นŒ์š”?

Spring Security์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๊ถŒํ•œ์€ GrantedAuthority ๋ผ๋Š” ๊ณตํ†ต ๊ฐœ๋…์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์—ญํ• ๊ณผ ๊ถŒํ•œ์€ ์•„์ฃผ ๊ตฌ๋ถ„๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์—ญํ• ์€ ๊ถŒํ•œ์˜ ๋ฌถ์Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ๊ถŒํ•œ ๊ฐ„ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ถŒํ•œ์€ ๊ฐœ๋ณ„ ๋‹จ์œ„์ด๋ฉฐ, ์—ญํ• ์€ ์ด๋Ÿฐ ๊ถŒํ•œ๋“ค์˜ ๋ฌถ์Œ์ด๊ณ , ์—ญํ•  ๊ฐ„ ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ๋†’์€ ์—ญํ• ์ด ๋‚ฎ์€ ์—ญํ• ์— ์†ํ•œ ๊ถŒํ•œ๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ์ด์ฃ .

 

  • ๊ถŒํ•œ Permission
    • ํŠน์ • ์ž‘์—…์ด๋‚˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ๋ถ€์ ์ธ ๊ถŒํ•œ
    • ex) ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ(POST), ๋Œ“๊ธ€ ์ž‘์„ฑ(POST_COMMENT), ๋Œ“๊ธ€ ์‚ญ์ œ(DELETE_COMMENT) ๋“ฑ
  • ์—ญํ•  Role
    • ์—ฌ๋Ÿฌ ๊ถŒํ•œ์„ ๋ฌถ์–ด๋†“์€ ์ง‘ํ•ฉ
    • ex) ROLE_ADMIN, ROLE_USER
      • ROLE_ADMIN์€ ๊ณต์ง€์‚ฌํ•ญ ์ž‘์„ฑ, ์‚ฌ์šฉ์ž ์กฐํšŒ, ์‚ฌ์šฉ์ž ์‚ญ์ œ ๋“ฑ์˜ ๊ถŒํ•œ์œผ๋กœ ๋ฌถ์—ฌ์žˆ์Œ
      • ROLE_USER๋Š” ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ, ๋Œ“๊ธ€ ์ž‘์„ฑ, ๋Œ“๊ธ€ ์กฐํšŒ ๋“ฑ์˜ ๊ถŒํ•œ์œผ๋กœ ๋ฌถ์—ฌ์žˆ์Œ

 

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š”

๊ด€๋ฆฌ์ž/์ฑ„๋„ ๋งค๋‹ˆ์ €/์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ์ •๋„๋กœ ๊ถŒํ•œ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ RoleHierarchy ๋นˆ์„ ๋“ฑ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด RoleHierarchy ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Spring Security์—์„œ ์ง€์›ํ•˜๋Š” ๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ ์„ค์ • ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

@Bean
public RoleHierarchy roleHierarchy() {
    return RoleHierarchyImpl.fromHierarchy("""
        ROLE_ADMIN > ROLE_CHANNEL_MANAGER
        ROLE_CHANNEL_MANAGER > ROLE_USER
        """);
}

 

์œ„ ์„ค์ •๋งŒ ํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ์ €๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์ ์šฉ๋˜์ง€ ์•Š์•„ MethodSecurityExpressionHanlder ๋นˆ๋„ ๋“ฑ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

@Configuration
@EnableWebSecurity
// ๐ŸŒŸ MethodSecurityExpressionHandler ์‚ฌ์šฉ ์‹œ ์• ๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€
@EnableMethodSecurity
public class SecurityConfig {


    @Bean
    SecurityFilterChain chain(HttpSecurity httpSecurity,
        CustomAuthenticationFilter customAuthenticationFilter) throws Exception {
        httpSecurity
            .authorizeHttpRequests(auth -> auth
                (์ƒ๋žต)
        return httpSecurity.build();
    }

   (์ƒ๋žต)
   
   // ๐ŸŒŸ ๊ณ„์ธต ๊ตฌ์กฐ ์ ์šฉ
    @Bean
    public RoleHierarchy roleHierarchy() {
        return RoleHierarchyImpl.fromHierarchy(
            "ROLE_ADMIN > ROLE_CHANNEL_MANAGER\n" +
                "ROLE_CHANNEL_MANAGER > ROLE_USER"
        );
    }

    @Bean
    public MethodSecurityExpressionHandler methodSecurityExpressionHandler(
        RoleHierarchy roleHierarchy) {
        DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
        handler.setRoleHierarchy(roleHierarchy);
        return handler;
    }

}

 

๊ธฐ์กด์— ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด๋–ค Role๋„ ๋‚˜๋ˆ„์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—

์‚ฌ์šฉ์ž๋ณ„๋กœ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋Š” ์ฝ”๋“œ๋„ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

public enum Role {
    ROLE_ADMIN,
    ROLE_CHANNEL_MANAGER,
    ROLE_USER
}

 

์ดํ›„ User ์—”ํ‹ฐํ‹ฐ์— Role ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

์ด์ œ ๊ธฐ๋Šฅ๋ณ„๋กœ ๊ถŒํ•œ์„ ์„ค์ •ํ• ๊ฑด๋ฐ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • URL ๋ณด์•ˆ
  • ๋ฉ”์„œ๋“œ ๋ณด์•ˆ

 

URL ๋ณด์•ˆ ๋ฐฉ๋ฒ•์€ SecurityFilterChain์—์„œ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

authorizeHttpRequest์˜ requestMatchers ์„ค์ •์—์„œ hasRole / hasAuthority๋กœ ๊ถŒํ•œ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

 

hasrRole("USER")๊ณผ hasAuthority("ROLE_USER")๋Š” ๊ฐ™์€ ์˜๋ฏธ์ธ๋ฐ,

hasRole๋กœ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ ‘๋‘์‚ฌ ROLE_์„ ๋ถ™์—ฌ ROLE_USER ๊ถŒํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

hasAuthority๋Š” ROLE_ ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์ด์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ROLE_USER๋ผ๋Š” ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

@Bean
SecurityFilterChain chain(HttpSecurity httpSecurity,
    CustomAuthenticationFilter customAuthenticationFilter) throws Exception {
    httpSecurity
        .authorizeHttpRequests(auth -> auth
            // ๋ชจ๋‘์—๊ฒŒ ํ—ˆ์šฉ
            .requestMatchers("/api/auth/csrf-token").permitAll()
            .requestMatchers(HttpMethod.POST, "/api/users").permitAll()
            .requestMatchers(HttpMethod.POST, "/api/auth/login").permitAll()
            // ๊ทธ ์™ธ API๋Š” ์ตœ์†Œ ROLE_USER ๊ถŒํ•œ ํ•„์š”
            .requestMatchers("/api/**").hasRole("USER")
            // admin API๋Š” ROLE_ADMIN ๊ถŒํ•œ ํ•„์š”
            .requestMatchers("/admin/**").hasAuthority("ROLE_ADMIN")
            // ๊ทธ ์™ธ ์ธ์ฆ ํ•„์š”
            .anyRequest().authenticated())
        (์ƒ๋žต)
    return httpSecurity.build();
}

 

๋ฉ”์„œ๋“œ ๋ณด์•ˆ์€ @PreAuthorize ์• ๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

API ์ ‘๊ทผ ์ œํ•œ ์ž์ฒด๋ฅผ ์ œ์–ดํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ์œ„์— ๋ถ™์ด๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

// ์—ฌ๋Ÿฌ ๊ถŒํ•œ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
@PreAuthorize("hasAnyRole('ADMIN', 'MANAGER')")
public List<Employee> findAllEmployees() {
    return employeeRepository.findAll();
}

 


 

์ฐธ๊ณ ์ž๋ฃŒ

https://juintination.tistory.com/entry/Spring-Security-RoleHierarchy-%EA%B3%84%EC%B8%B5%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

https://jinmlee210.tistory.com/82

https://velog.io/@goat_hoon/Spring-Security-%EC%9C%A0%EC%A0%80%EC%9D%98-ROLE%EB%B3%84%EB%A1%9C-Authority-%EA%B6%8C%ED%95%9C-%EB%B6%80%EC%97%AC%ED%95%98%EA%B8%B0

'๐ŸŒฟSpring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #2 ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, JWT ํ† ํฐ ํƒˆ์ทจ + ๋Œ€์‘ ์ „๋žต  (0) 2025.05.23
[Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #1: CSRF๊ณต๊ฒฉ๊ณผ XSS ๊ณต๊ฒฉ + ๋Œ€์‘ ์ „๋žต  (1) 2025.05.23
[Spring Security] ์ปค์Šคํ…€ ํ•„ํ„ฐ ๊ตฌํ˜„ํ•˜๊ธฐ / UsernamePasswordAuthenticationFilter ๋ฐ”ํƒ•  (0) 2025.05.21
[Spring Security] CSRF ์„ค์ • 403 ์‘๋‹ต ๋ฌธ์ œ ํ•ด๊ฒฐ: CsrfTokenRepository์— ๋Œ€ํ•œ ์ดํ•ด  (0) 2025.05.20
[Spring Security] SecurityFilterChain ํ•„ํ„ฐ ๋ชฉ๋ก ํ™•์ธํ•˜๊ธฐ (๋””๋ฒ„๊น…/๋กœ๊ทธ)  (0) 2025.05.19
'๐ŸŒฟSpring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #2 ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, JWT ํ† ํฐ ํƒˆ์ทจ + ๋Œ€์‘ ์ „๋žต
  • [Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #1: CSRF๊ณต๊ฒฉ๊ณผ XSS ๊ณต๊ฒฉ + ๋Œ€์‘ ์ „๋žต
  • [Spring Security] ์ปค์Šคํ…€ ํ•„ํ„ฐ ๊ตฌํ˜„ํ•˜๊ธฐ / UsernamePasswordAuthenticationFilter ๋ฐ”ํƒ•
  • [Spring Security] CSRF ์„ค์ • 403 ์‘๋‹ต ๋ฌธ์ œ ํ•ด๊ฒฐ: CsrfTokenRepository์— ๋Œ€ํ•œ ์ดํ•ด
์†Œ์˜ ๐Ÿ€
์†Œ์˜ ๐Ÿ€
Hello World โœจ
  • ์†Œ์˜ ๐Ÿ€
    Soyoung's Dev Lab
    ์†Œ์˜ ๐Ÿ€
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ธ€์“ฐ๊ธฐ ๊ด€๋ฆฌ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (79)
      • ๐Ÿ“ข ๊ฒŒ์‹œํŒ (0)
      • ๐ŸŒฟSpring (20)
      • โ˜•Java (7)
        • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (7)
      • โš™๏ธ CS (26)
        • ๐Ÿ›œ ๋„คํŠธ์›Œํฌ (5)
        • ๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
        • ๐Ÿ–ฒ๏ธ์šด์˜์ฒด์ œ (9)
        • ๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ & ์•Œ๊ณ ๋ฆฌ์ฆ˜ (4)
      • ๐Ÿ“ค ๋ฐฐํฌ (4)
        • Docker (4)
        • AWS (0)
      • ๐Ÿ“ฐ ๊ธฐํƒ€ ๊ฐœ๋ฐœ ์ž๋ฃŒ (12)
      • ๐Ÿ–ฅ๏ธ ํ”„๋กœ์ ํŠธ (0)
      • ๐Ÿ‘ฉ‍๐Ÿ’ป ํ™œ๋™ & ํ›„๊ธฐ (1)
      • ๐Ÿต ์ด์•ผ๊ธฐ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํƒœ๊ทธ
  • ๋งํฌ

    • github
    • velog
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    Spring Security
    Spring
    ์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ
    ๊ฐœ๋ฐœ
    ์šด์˜์ฒด์ œ
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ๊ธฐ์ˆ  ๋ฉด์ ‘
    GIT
    ๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ
    ์œ„ํด๋ฆฌ ํŽ˜์ดํผ
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    ์ž๋ฃŒ๊ตฌ์กฐ
    ์„œ๋ฒ„
    Java
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    ๋„คํŠธ์›Œํฌ
    ๋ฐฐํฌ
    docker
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์†Œ์˜ ๐Ÿ€
[Spring Security] Role Hierarchy: ๊ถŒํ•œ ๊ณ„์ธต ๊ตฌ์กฐ ๊ฐœ๋… ์ •๋ฆฌ & ์ ์šฉ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”