๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [Spring Security] 'Spring Security' ํŽธ

ybkยท2024๋…„ 4์›” 30์ผ

spring

๋ชฉ๋ก ๋ณด๊ธฐ
22/55
post-thumbnail

๐Ÿ”” 'Spring Security'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ Spring Security

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด์•ˆ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

  1. ์ธ์ฆ(Authentication): ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๊ณ  ์ธ์ฆํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž์‹ ์ด ์ฃผ์žฅํ•˜๋Š” ์‚ฌ๋žŒ์ž„์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค.(์‹ ๋ถ„์ฆ)

  2. ์ธ๊ฐ€(Authorization): ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ ์ œ์–ด, ๋ฉ”์„œ๋“œ ๋‹จ์œ„์˜ ๋ณด์•ˆ ์„ค์ • ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ์ธ๊ฐ€๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํŠน์ • ๋ฆฌ์†Œ์Šค๋‚˜ ์ž‘์—…์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ๋ฐ›์œผ๋ฉด, ํ•œ ๋ช… ์ด์ƒ์˜ ๊ฐœ์ธ์—๊ฒŒ ํ—ˆ์šฉ๋œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค ์ž‘์—…์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋ณด์•ˆ ํ•„ํ„ฐ ์ฒด์ธ(Security Filter Chain): HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ๋ณด์•ˆ ํ•„ํ„ฐ ์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ํ•„ํ„ฐ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ณด์•ˆ ์ธก๋ฉด์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ์„ธ์…˜ ๊ด€๋ฆฌ(Session Management): ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•˜๊ณ , ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ์„ค์ •, ์„ธ์…˜ ์ƒ์„ฑ ๋ฐ ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  5. Remember-Me ๊ธฐ๋Šฅ: ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ, ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜์–ด๋„ ๋‹ค์Œ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘์†ํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  6. CSRF(Cross-Site Request Forgery) ๋ฐฉ์–ด: CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’Ÿ UserDetailsService

๋‹จ์ผ ๋ฉ”์„œ๋“œ loadUserByUsername (String username)์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ UserDetails ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถฉ์กฑํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ฃผ์š” ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Component
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {

    private final BCryptPasswordEncoder encoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if(username.equals("son")){
            String encoded = encoder.encode("son7");
            return new User("son",encoded, List.of(new SimpleGrantedAuthority("user")));
        }else if (username.equals("lee")){
            String encoded = encoder.encode("lee9");
            return new User("lee",encoded, List.of(new SimpleGrantedAuthority("admin"),
                    new SimpleGrantedAuthority("user")));
        } else{
            throw new UsernameNotFoundException(username + " not found");
        }
    }
}
  • UserDetailsService ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ loadUserByUsername ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„(username)์„ ๋ฐ›์•„ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋กœ๋“œํ•˜๊ณ  UserDetails ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด UsernameNotFoundException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  • ์ด ์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด "son"์ธ ๊ฒฝ์šฐ์™€ "lee"์ธ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "son" ์‚ฌ์šฉ์ž๋Š” "user" ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฉฐ, "lee" ์‚ฌ์šฉ์ž๋Š” "admin"๊ณผ "user" ๊ถŒํ•œ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๊ฐ๊ฐ "son7"๊ณผ "lee9"์ด๋ฉฐ, BCryptPasswordEncoder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • BCryptPasswordEncoder๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฝ”๋” ์ค‘ ํ•˜๋‚˜๋กœ, ์ธ์ฝ”๋”๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฝ”๋”์˜ encode() ๋ฉ”์„œ๋“œ์— ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ „๋‹ฌ ํ›„ ํ˜ธ์ถœํ•˜๋ฉด, ์•”ํ˜ธํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

@Component ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์Šคํ”„๋ง์—๊ฒŒ ์ด ํด๋ž˜์Šค๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์•ผ ํ•จ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋˜ํ•œ @RequiredArgsConstructor ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ ์ฃผ์ž… ๋ฐฉ์‹์œผ๋กœ BCryptPasswordEncoder๋ฅผ ์ฃผ์ž…๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž ์ธ์ ์…˜์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •์—์„œ ์ด CustomUserDetailsService ๋นˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์ธ์ฆ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’Ÿ Spring Security์˜ ์„ค์ • ํด๋ž˜์Šค

  • SecurityFilterChain : SecurityFilterChain ๋นˆ์„ ์ƒ์„ฑํ•ด HttpSecurity๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • BCryptPasswordEncoder ๋นˆ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
@Configuration
@EnableMethodSecurity
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf -> csrf.disable());
        http.formLogin(form -> form.loginPage("/login"));
        return http.build();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • HttpSecurity ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์™€์„œ Spring Security์˜ ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. http.csrf(csrf -> csrf.disable())๋Š” CSRF ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • http.formLogin(form -> form.loginPage("/login"))์€ ๋กœ๊ทธ์ธ ํผ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. form.loginPage("/login")์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด Spring Security๊ฐ€ ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค.
  • return http.build()์€ HttpSecurity ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SecurityFilterChain์„ ๊ตฌ์„ฑํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

* CSRF(Cross-Site Request Forgery)๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋กœ, ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ์•…์˜์ ์ธ ๊ณต๊ฒฉ์ž์— ์˜ํ•ด ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.


๐Ÿ’Ÿ ๋ณด์•ˆ ์„ค์ •

Spring Security์˜ ์„ค์ • ํด๋ž˜์Šค์˜ @EnableMethodSecurity ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด Spring Security์˜ ๋ฉ”์„œ๋“œ ์ˆ˜์ค€ ๋ณด์•ˆ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. @PreAuthorize ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ:

  • Controller ํด๋ž˜์Šค์— @PreAuthorize ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. JSP ํŒŒ์ผ์—์„œ Spring Security ํƒœ๊ทธ ์‚ฌ์šฉ:

  • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” JSP ํŒŒ์ผ์—์„œ๋Š” <sec:authorize> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ƒํƒœ๋‚˜ ๊ถŒํ•œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Controller
public class Controller38 {

    @GetMapping("/login")
    public String login(){
        return "login";
    }
    
    @GetMapping("/path1")
    @PreAuthorize("isAuthenticated()")
    public void path1(){
        System.out.println("Controller38.path1");
    }

    @GetMapping("/path2")
    @PreAuthorize("hasAnyAuthority('user')")
    public void path2(){
        System.out.println("์œ ์ € ๊ถŒํ•œ์ด๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅ");
    }

    @GetMapping("/path4")
    public void path4(){

    }
}
  • login() ๋ฉ”์„œ๋“œ๋Š” GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • path1: ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ๋กœ๋กœ, @PreAuthorize("isAuthenticated()") ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด ์žˆ์–ด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ํ•ด๋‹น ๊ฒฝ๋กœ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ์ด Controller38.path1์ด ์ถœ๋ ฅ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • path2: hasAnyAuthority('user') ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ์ด ํ•ด๋‹น ๊ฒฝ๋กœ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, 'user' ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 'user' ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ์ด "์œ ์ € ๊ถŒํ•œ์ด๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅ"์ด ์ถœ๋ ฅ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • path4: path4.jsp์—์„œ ์ ‘๊ทผ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

path4.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>path4.jsp</h3>

<div>๋ˆ„๊ตฌ๋‚˜ ๋ณด๋Š” ์ปจํ…์ธ </div>
  <sec:authorize access="isAuthenticated()">
      <div>๋กœ๊ทธ์ธ ํ•ด์•ผ ๋ณด์ด๋Š” ์ปจํ…์ธ </div>
  </sec:authorize>
  <sec:authorize access="not isAuthenticated()">
      <div>๋กœ๊ทธ์ธ ์•ˆํ•ด์•ผ ๋ณด์ด๋Š” ์ปจํ…์ธ </div>
  </sec:authorize>
  <sec:authorize access="hasAnyAuthority('admin')">
      <div>์–ด๋“œ๋ฏผ๋งŒ ๋ณด์ด๋Š” ์ปจํ…์ธ </div>
  </sec:authorize>
</body>
</html>

"/path4" ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. <sec:authorize> ํƒœ๊ทธ:

    • Spring Security์˜ ํƒœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ๊ด€๋ จ ๊ถŒํ•œ์„ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
    • access ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ปจํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์ˆจ๊น๋‹ˆ๋‹ค.
  2. isAuthenticated():

    • ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜์—ˆ์„ ๋•Œ(Authentication ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ๋•Œ) ์ฐธ์ด ๋˜๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ํ•ด๋‹นํ•˜๋Š” ์ปจํ…์ธ ๊ฐ€ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  3. not isAuthenticated():

    • ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์•˜์„ ๋•Œ(์ฆ‰, ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•˜์„ ๋•Œ) ์ฐธ์ด ๋˜๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.
    • ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ํ•ด๋‹นํ•˜๋Š” ์ปจํ…์ธ ๊ฐ€ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  4. hasAnyAuthority('admin'):

    • ์‚ฌ์šฉ์ž๊ฐ€ "admin" ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ ์ฐธ์ด ๋˜๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.
    • "admin" ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ํ•ด๋‹นํ•˜๋Š” ์ปจํ…์ธ ๊ฐ€ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

0๊ฐœ์˜ ๋Œ“๊ธ€