Authentication Authorization

프로젝트전공부·2024년 8월 26일

스피링기본

목록 보기
6/8

인증(Authentication):

사용자의 신원을 확인하여 시스템 접근을 허용합니다.
권한 부여 전에 수행됩니다.
일반적으로 사용자의 로그인 정보가 필요합니다.
인증 실패 시 보통 401 오류 응답을 받습니다.
예를 들어, 은행 고객이나 직원이 앱에서 작업을 수행하려면 신원 확인이 필요합니다.
권한 부여(Authorization):

자원 접근을 위해 개인이나 사용자의 권한을 확인합니다.
항상 인증 후에 이루어집니다.
사용자의 권한이나 역할이 필요합니다.
권한 부여 실패 시 보통 403 오류 응답을 받습니다.
애플리케이션에 로그인한 후, 역할과 권한에 따라 수행할 수 있는 작업이 결정됩니다.

권한 확인방법

hasAuthority(): 단일 권한을 수락하며, 해당 엔드포인트는 구성된 단일 권한에 대해 검증됩니다. 동일한 권한을 가진 사용자만 엔드포인트를 호출할 수 있습니다.

hasAnyAuthority(): 여러 권한을 수락하며, 해당 엔드포인트는 구성된 여러 권한에 대해 검증됩니다. 구성된 권한 중 하나라도 가진 사용자만 엔드포인트를 호출할 수 있습니다.

access(): Spring Expression Language (SpEL)을 사용하여 위의 방법으로는 불가능한 권한 구성을 무제한으로 제공합니다. OR, AND와 같은 연산자를 access() 내부에서 사용할 수 있습니다.

@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
    CsrfTokenRequestAttributeHandler requestHandler = new CsrfTokenRequestAttributeHandler();
    requestHandler.setCsrfRequestAttributeName("_csrf");
    
    http.securityContext().requireExplicitSave(false)
        .and().sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.ALWAYS))
        .cors().configurationSource(new CorsConfigurationSource() { ... })
        .and().csrf(csrf -> csrf.csrfTokenRequestHandler(requestHandler)
            .ignoringRequestMatchers("/contact", "/register")
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
        .addFilterAfter(new CsrfCookieFilter(), BasicAuthenticationFilter.class)
        .authorizeHttpRequests()
            .requestMatchers("/myAccount").hasAuthority("VIEWACCOUNT")
            .requestMatchers("/myBalance").hasAnyAuthority("VIEWACCOUNT", "VIEWBALANCE")
            .requestMatchers("/myLoans").hasAuthority("VIEWLOANS")
            .requestMatchers("/myCards").hasAuthority("VIEWCARDS")
            .requestMatchers("/user").authenticated()
            .requestMatchers("/notices", "/contact", "/register").permitAll()
        .and().formLogin()
        .and().httpBasic();
    
    return http.build();
}

NSIDE SPRING SECURITY

Spring Security에서 역할 요구 사항은 다음과 같은 방법으로 구성할 수 있습니다.

hasRole(): 단일 역할 이름을 받아 해당 엔드포인트가 구성되며, 사용자는 지정된 단일 역할에 대해 검증됩니다. 동일한 역할이 구성된 사용자만 엔드포인트를 호출할 수 있습니다.

hasAnyRole(): 여러 역할을 받아 해당 엔드포인트가 구성되며, 사용자는 지정된 역할 중 하나에 대해 검증됩니다. 구성된 역할 중 하나를 가진 사용자만 엔드포인트를 호출할 수 있습니다.

access(): Spring Expression Language (SpEL)을 사용하여 위의 방법으로는 불가능한 역할 구성을 무제한으로 제공합니다. access() 메서드 내에서 OR, AND와 같은 연산자를 사용할 수 있습니다.

@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
    CsrfTokenRequestAttributeHandler requestHandler = new CsrfTokenRequestAttributeHandler();
    requestHandler.setCsrfRequestAttributeName("_csrf");
    http.securityContext().requireExplicitSave(false)
        .and().sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.ALWAYS))
        .cors().configurationSource(new CorsConfigurationSource() { ... })
        .and().csrf((csrf) -> csrf.csrfTokenRequestHandler(requestHandler)
            .ignoringRequestMatchers("/contact", "/register")
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
        .addFilterAfter(new CsrfCookieFilter(), BasicAuthenticationFilter.class)
        .authorizeHttpRequests()
            .requestMatchers("/myAccount").hasRole("USER")
            .requestMatchers("/myBalance").hasAnyRole("USER", "ADMIN")
            .requestMatchers("/myLoans").hasRole("USER")
            .requestMatchers("/myCards").hasRole("USER")
            .requestMatchers("/user").authenticated()
            .requestMatchers("/notices", "/contact", "/register").permitAll()
        .and().formLogin()
        .and().httpBasic();
}
profile
프로젝트전에 해당 부분을 깊게 공부한것을 올려두는 벨로그

0개의 댓글