TIL

+24 Spring Security 프레임워크

JAVABOZA 2023. 7. 8. 00:37

Spring Security는 Filter 기반으로 동작함

 

 

인증 인가처리를 쉽게 도와줌

 

 

@EnableWebSecurity  

Spring Security 지원을 가능하게함

 

securityFilterChain()

이 메서드는 개발자가 security를 사용할 때 어떤 url은 인가하고 어떤 url은 인가하지 않은 설정해주고

"어떤 기능을 사용하겠다. " , "어떤 기능은 사용하지 않겠다."  설정들을 수행

 

 

 

 WebSecurityConfig

package com.sparta.springauth.config;

import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity // Spring Security 지원을 가능하게 함
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // CSRF 설정
        http.csrf((csrf) -> csrf.disable());

		
        http.authorizeHttpRequests((authorizeHttpRequests) ->
        		//authorizeHttpRequests.requestMatchers() 괄호안에 원하는 url 넣고 .permitAll()하면 그 해당 url 접근허용
                // 이 코드에서는 .toStaticResources에 들어오는 즉 resource은 모두 허가(인가)
                
                authorizeHttpRequests
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
                        // 이 코드는 /api/user/** 로 시작하는 어떤것들이 오는 모든 요청 전부 다 인가
                        .requestMatchers("/api/user/**").permitAll()
                         // 그 외 모든 요청 인증처리
                        .anyRequest().authenticated()
        );

        // 로그인 사용 // security 에서 기본으로 제공하는 로그인 폼 페이지
        http.formLogin(Customizer.withDefaults());

        return http.build();
    }
}

 

 UsernamePasswordAuthenticationFilter

는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 filter

 

  • SecurityContextHolder
    • SecurityContext는 인증이 완료된 사용자의 상세 정보(Authentication)를 저장합니다.
    • SecurityContext는 SecurityContextHolder 로 접근할 수 있습니다.
    // 예시코드
    SecurityContext context = SecurityContextHolder.createEmptyContext();
    Authentication authentication = new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
    context.setAuthentication(authentication); // SecurityContext 에 인증 객체 Authentication 를 저장합니다.
    
    SecurityContextHolder.setContext(context);
    

 

● SecurityContextHolder

SecurityContext는 인증이 완료된 사용자의 상세 정보(Authentication)를 저장합니다.

 

* Principal :사용자 식별 // username 과 password방식으로 인증할 때 userdetails 인스턴스

* Credentials : 비밀번호를 사용자 인증에 사용 후 비움

* authorites : 사용자에게 부여한 권한을 GrantedAuthority로 추상화하여 사용

 

UsernamePasswordAuthenticationToken는 Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스로, 인증객체를 만드는데 사용

<UserDetails>
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    UserRoleEnum role = user.getRole();
    String authority = role.getAuthority();

    SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
    Collection<GrantedAuthority> authorities = new ArrayList<>();
    authorities.add(simpleGrantedAuthority);

    return authorities;
}

Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());

'TIL' 카테고리의 다른 글

+26 RestTemplate이란 무엇일까?  (0) 2023.07.11
+25 Spring Security : JWT로그인  (0) 2023.07.09
+23 스프링부트 필터 Filter  (0) 2023.07.07
+22 JWT 토큰기반 무엇일까?  (0) 2023.07.06
+21 Spring DATA JPA란 무엇??  (0) 2023.07.05