[Spring] - ๐Ÿ” Spring Security

CodeByHanยท2025๋…„ 4์›” 15์ผ

์Šคํ”„๋ง

๋ชฉ๋ก ๋ณด๊ธฐ
22/33

๐Ÿ” Spring Security

  • Spring Security๋Š” Spring ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ธ์ฆ(Authentication), ์ธ๊ฐ€(Authorization) ์˜ ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ

๐Ÿค” ์ธ์ฆ(Authentication)

  • ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •
  • ์˜ˆ์‹œ) ๋กœ๊ทธ์ธ ์‹œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜, ์ƒ์ฒด์ธ์‹(์ง€๋ฌธ, ์–ผ๊ตด ์ธ์‹)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
  • "๋ˆ„๊ตฌ์ธ๊ฐ€?"๋ฅผ ํ™•์ธ

๐Ÿค” ์ธ๊ฐ€(Authorization)

  • ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •
  • ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ž‘์—…์ด๋‚˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •
  • ์˜ˆ์‹œ) ์€ํ–‰ ์•ฑ์—์„œ ๊ณ„์ขŒ ์กฐํšŒ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ณ„์ขŒ๋Š” ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
  • "๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?"๋ฅผ ๊ฒฐ์ •

๐Ÿ“Œ ํ๋ฆ„

  • Filters: ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ํ•„ํ„ฐ(์˜ˆ: ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ ์ฒด์ธ)๋ฅผ ๊ฑฐ์นœ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ์ธ์ฆ, ์ธ๊ฐ€, ๋กœ๊น… ๋“ฑ ๋‹ค์–‘ํ•œ ์‚ฌ์ „ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค..
  • DispatcherServlet: ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ ์š”์ฒญ์€ DispatcherServlet์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
    -> ์ž์„ธํ•œ ์ •๋ณด๋Š” ์Šคํ”„๋ง(Spring) - ์„œ๋ธ”๋ฆฟ(Servlet) ์ฐธ๊ณ 
  • Handler Interceptors: DispatcherServlet์€ ์š”์ฒญ์„ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๊ฑฐ์นœ๋‹ค.
  • Controller: ๋งˆ์ง€๋ง‰์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์‹คํ–‰๋˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์‹œ ์—ญ์ˆœ์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

Filter

  • Servlet Filter๋Š” ์š”์ฒญ(Request), ์‘๋‹ต(Response) ๊ฐ์ฒด๋ฅผ ๋ณ€ํ˜•ํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • Filter๋Š” ํŠน์ • URL ํŒจํ„ด์ด๋‚˜ ์„œ๋ธ”๋ฆฟ์— ๋งคํ•‘์ด ๊ฐ€๋Šฅ, Filter Chain ๋‚ด์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰
  • Filter Chain์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•„ํ„ฐ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ, ๊ฐ Filter๋Š” ์ฒด์ธ์˜ ๋‹ค์Œ Filter๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ์ฒ˜๋ฆฌ ์ค‘๋‹จ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Spring Security๋Š” FilterChainProxy๋ฅผ ์ด์šฉํ•˜์—ฌ Filter๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, FilterChainProxy์—์„œ๋Š” ์ฒด์ด๋‹ ํ•„ํ„ฐ๋กœ SecurityFilterChainProxy์„ ์‚ฌ์šฉํ•œ๋‹ค.
public class FilterChainProxy extends GenericFilterBean {

    ...

    private SecurityContextHolderStrategy securityContextHolderStrategy;
    private List<SecurityFilterChain> filterChains;
    private FilterChainValidator filterChainValidator;
    private HttpFirewall firewall;
    private RequestRejectedHandler requestRejectedHandler;
    private ThrowableAnalyzer throwableAnalyzer;
    private FilterChainDecorator filterChainDecorator;
    
    
    ...
    
  }
public interface SecurityFilterChain {
    boolean matches(HttpServletRequest request);
    List<Filter> getFilters();
}

SecurityFilterChain๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง์„ ์œ„ํ•ด, Filter๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ํ•ด๋‹น Filter๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋ธ”๋ฆฟ์—์„œ ์ •์˜ํ•œ Filter๋‹ค

package jakarta.servlet;

import java.io.IOException;

public interface Filter {
    default void init(FilterConfig filterConfig) throws ServletException {
    }

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    default void destroy() {
    }
}

๐Ÿ“Œ SecurityContextHolder

  • Spring Security์—์„œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์ ‘๊ทผํ•˜๋Š”๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค
  • ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ์ฃผ์š” ์—ญํ• ์€ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์‰ฝ๊ฒŒ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ
  • ํŠน์ • ํŽ˜์ด์ง€๋‚˜, API ํ˜ธ์ถœ ์‹œ์— ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉด, SecurityContextHolder ๋ฅผ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ Authentication ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ์ธ์ฆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋‚ด์šฉ ํ™•์ธ ๊ฐ€๋Šฅ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ThreadLocal์„ ์‚ฌ์šฉ

SecurityContext

  • ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • Authentication ๊ฐ์ฒด๋ฅผ ํฌํ•จ
  • ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ -> Authentication ๊ฐ์ฒด ์ƒ์„ฑ -> Authentication ๊ฐ์ฒด SecurityContext์— ์ €์žฅ -> ์–ด๋””์„œ๋“  SecurityContext ๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์ ‘๊ทผ ๊ฐ€๋Šฅ

Authentication

  • Principal : getPrincipal() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ, ๋ณดํ†ต ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ UserDetails ๊ฐ์ฒด์ด๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๋ช…(username)์„ ๋‚˜ํƒ€๋‚ด๋Š” String์ผ ์ˆ˜ ์žˆ๋‹ค.

  • Credentials : getCredentials() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด(๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  • Authorites : getAuthorities() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ถŒํ•œ(๋˜๋Š” ์—ญํ• )์˜ ๋ชฉ๋ก์„ ์ œ๊ณต. ์ด ๊ถŒํ•œ๋“ค์€ GrantedAuthority ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋กœ ํ‘œํ˜„

Authenticated: isAuthenticated() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜. ์ธ์ฆ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒฝ์šฐ, ์ด ๊ฐ’์€ true

Authentication ํ๋ฆ„

UserDetails

  • Spring Security์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ
  • ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ถŒํ•œ ๋“ฑ์„ ํฌํ•จํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์บก์Аํ™”ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, Spring Security๋Š” ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
๋ฉ”์†Œ๋“œ๋ฐ˜ํ™˜ ํƒ€์ž…์„ค๋ช…๊ธฐ๋ณธ๊ฐ’
getAuthorities()Collection<? extends GrantedAuthority>์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋ชฉ๋ก ๋ฐ˜ํ™˜
getPassword()String์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ˜ํ™˜
getUsername()String์‚ฌ์šฉ์ž ๊ณ ์œ  ๊ฐ’ ๋ฐ˜ํ™˜
isAccountNonExpired()boolean๊ณ„์ • ๋งŒ๋ฃŒ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜true (๋งŒ๋ฃŒ ์•ˆ๋จ)
isAccountNonLocked()boolean๊ณ„์ • ์ž ๊น€ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜true (์ž ๊ธฐ์ง€ ์•Š์Œ)
isCredentialsNonExpired()boolean๋น„๋ฐ€๋ฒˆํ˜ธ ๋งŒ๋ฃŒ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜true (๋งŒ๋ฃŒ ์•ˆ๋จ)
isEnabled()boolean๊ณ„์ • ํ™œ์„ฑํ™” ์—ฌ๋ถ€ ๋ฐ˜ํ™˜true (ํ™œ์„ฑํ™” ๋จ)

UserDetailsService

  • ์‚ฌ์šฉ์ž๋ช…(username)์„ ๊ธฐ๋ฐ˜์œผ๋กœ UserDetails ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋‹ค๋ฅธ ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ
  • ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ปค์Šคํ…€ ๊ฐ€๋Šฅ
public class CustomUserDetailService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return null;
    }
}

์ž์ฃผ์“ฐ๋Š” Spring Security ์„ค์ •

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
      return http
    }
}

SecurityFilterChain : Spring Security์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ์ •์ฑ…(์ธ์ฆ, ์ธ๊ฐ€ ๋“ฑ)์„ ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ ํ•„ํ„ฐ ์ฒด์ธ ํ˜•ํƒœ๋กœ ๋“ฑ๋กํ•˜๋Š” ์—ญํ• 

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
      return http
               .csrf(csrf -> csrf.disable()) // csrf ๊ธฐ๋Šฅ ์ œ๊ฑฐ
    }
}
  • .csrf(csrf -> csrf.disable()) : Spring Security์—์„œ CSRF(Cross-Site Request Forgery) ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์„ค์ •
  • .cors(cors -> cors.disable()) : CORS ๋น„ํ™œ์„ฑํ™”
.formLogin(
         form -> {
              form
.failureForwardUrl("/login?error=true")
// ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ์ง€์ •ํ•œ URL๋กœ forward(๋‚ด๋ถ€ ์ด๋™). URL์€ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ , ์‹คํŒจ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

.successForwardUrl("/")
//  ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์ง€์ •ํ•œ URL๋กœ forward(๋‚ด๋ถ€ ์ด๋™). URL์€ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ , ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ.

.defaultSuccessUrl("/")
//  ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์ง€์ •ํ•œ URL๋กœ redirect(์™ธ๋ถ€ ์ด๋™). URL์ด ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉฐ, ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ.

usernameParameter("loginId")
//  ๋กœ๊ทธ์ธ ํผ์—์„œ ์•„์ด๋”” ์ž…๋ ฅ๋ž€์˜ name ์†์„ฑ์„ "loginId"๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •. (๊ธฐ๋ณธ๊ฐ’: "username")

.passwordParameter("loginPwd")
//   ๋กœ๊ทธ์ธ ํผ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ๋ž€์˜ name ์†์„ฑ์„ "loginPwd"๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •. (๊ธฐ๋ณธ๊ฐ’: "password")

.loginProcessingUrl("/signin")
//   ๋กœ๊ทธ์ธ ํผ์ด ์ œ์ถœ๋  ๋•Œ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” URL์„ ์ง€์ •. (POST ์š”์ฒญ ์‹œ ์ด URL๋กœ ์ธ์ฆ ์ฒ˜๋ฆฌ)

.loginPage("/signin")
//   ์ธ์ฆ์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผ ์‹œ ๋ณด์—ฌ์ค„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์˜ URL์„ ์ง€์ •. (GET ์š”์ฒญ ์‹œ ๋กœ๊ทธ์ธ ํผ ์ œ๊ณต)

.permitAll()
//   ๋กœ๊ทธ์ธ ๊ด€๋ จ ํŽ˜์ด์ง€(๋กœ๊ทธ์ธ ํผ, ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ๋“ฑ)๋Š” ์ธ์ฆ ์—†์ด ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ

Customizer.withDefaults()
//   ์œ„์˜ ๋ชจ๋“  ์ปค์Šคํ…€ ์„ค์ • ์—†์ด, Spring Security์˜ ๊ธฐ๋ณธ formLogin ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
)
.logout(logout -> {
logout.logoutUrl("/signout")
//   ๋กœ๊ทธ์•„์›ƒ์„ ์ฒ˜๋ฆฌํ•  URL์„ ์ง€์ •. (POST ์š”์ฒญ ์‹œ ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ)

.logoutSuccessUrl("/")
//   ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต ํ›„ ์ด๋™ํ•  URL์„ ์ง€์ •. (redirect ๋ฐฉ์‹)

.invalidateHttpSession(true)
//   ๋กœ๊ทธ์•„์›ƒ ์‹œ ํ˜„์žฌ HTTP ์„ธ์…˜์„ ๋ฌดํšจํ™”(์‚ญ์ œ). (์„ธ์…˜์— ์ €์žฅ๋œ ์ •๋ณด ๋ชจ๋‘ ์‚ญ์ œ)

.clearAuthentication(true)
//   ๋กœ๊ทธ์•„์›ƒ ์‹œ `SecurityContext`์— ์ €์žฅ๋œ ์ธ์ฆ(Authentication) ์ •๋ณด๋ฅผ ์‚ญ์ œ. (์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ์—์„œ ์ œ๊ฑฐ)

.deleteCookies("JSESSIONID")
//   ๋กœ๊ทธ์•„์›ƒ ์‹œ ์ง€์ •ํ•œ ์ฟ ํ‚ค(JSESSIONID)๋ฅผ ์‚ญ์ œ. (์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘์—์„œ ์„ธ์…˜ ์ฟ ํ‚ค ์ œ๊ฑฐ)
 }
)
.authorizeHttpRequests(
         auth -> { 
auth.requestMatchers("/signup", "/signin").anonymous()
//   "/signup", "/signin" ๊ฒฝ๋กœ๋Š” ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€(anonymous) ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
//   ์ด๋ฏธ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค..

.requestMatchers("/user/**").hasRole("MEMBER")
//   "/user/**" ๊ฒฝ๋กœ๋Š” "MEMBER" ๊ถŒํ•œ(์—ญํ• )์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

.anyRequest().authenticated()
// ์œ„์—์„œ ์ง€์ •ํ•œ ๊ฒฝ๋กœ ์™ธ์˜ ๋ชจ๋“  ์š”์ฒญ์€ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
//   (๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€)
})

์ฐธ๊ณ 

profile
๋…ธ๋ ฅ์€ ๋ฐฐ์‹ ํ•˜์ง€ ์•Š์•„ ๐Ÿ”ฅ

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