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 |