어디부터 시작해야할지
..
감도안온다..
스프링 기반의 앱에서 보안(인증, 권한, 인가)등을 담당하기 위해 만들어진 하위 프레임워크이다.
Spring Security가 필터에서 아래 내용을 검증한다.
해당 경로의 접근이 누구에게 열려있는지
로그인이 완료된 사용자인지
해당되는 ROLE을 가지고 있는지
일전에 내가 웹 컨테이너랑 스프링 컨테이너 비교하면서 통신 흐름에 대해 간단하게 도식화한 그림이 있다.

이게바로 그 그림인데,
여기서 빠진 요소가 있다 바로 "필터" 임.
필터는 애플리케이션 시작 시점(Spring 컨테이너 초기화 시점)에 만들어져 서블릿 컨테이너에 등록하는데,
미리 만들어진 필터 인스턴스가 요청마다 동자갛는 방식이라서 매번 만들지 xxxx

여기서 DelegatingFilterProxy라는 녀석이 등장한다.
Spring Boot가 자동으로 등록FilterRegistrationBean 통해 DelegatingFilterProxy를 서블릿 컨테이너에 미리 등록즉, Spring Security Config가 만든 필터를 연결해준다.
DelegatingFilterProxy가 요청을 받게되면 Spring 컨테이너에서 SecurityFilterChain Bean을 찾아서 필터 체인을 실행한다.
실행순서는 일반 필터 → DelegatingFilterProxy(세큐리티 컨피그가 만든필터로 연결) → DispatcherServlet가 된다.

모두 작동한다. ( Spring MVC 컨트롤러로 안 가는 요청도 필터는 무조건 거쳐감 )
이게 바로 Filter가 Interceptor보다 범용적이고 낮은 레벨이라고 하는 이유기도하다.
1️⃣ 기본 설정 (
@Configuration등)
2️⃣ CSRF 비활성화
( REST API + JWT 환경에서는 CSRF 필요 없음 →csrf().disable()붙이면 된다고함. )
3️⃣ 세션STATELESS설정
( JWT는 세션 안 씀 →sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)붙이면된다.
4️⃣ URL별 권한 설정
5️⃣ 인증/인가 정책 설정
6️⃣ JWT 필터 삽입
7️⃣ 예외 처리 커스터마이징
8️⃣ CORS 설정 (필요 시)
9️⃣SecurityFilterChain반환
아무것도 모르겠지만 일단 SecurityConfig 클래스를 만들어보겠다

흠
일단 하는일이라도 일단 적어보겟다

SecurityConfig 는 아ㅏ까 말했듯이 필터를 만드는일을한다.
그러니 클래스안에는 SecurityFilterChain 을 반환해주는 함수가 필요하다.
SpringSecurity의 HttpSecurity 객체는 핵심 중의 핵심!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
HttpSecurity는 Spring Security에서 HTTP 요청에 대한 보안 설정을 구성할 수 있도록 제공하는 설정 객체이다.
이 설정객체의 내용을 개발자들이 원하는대로 채워주면 작동을한다 이말이야
뭐그냥 해당 객체를 수정하면서 필터를 만드는구나~ 정도로 이해하고 넘어가겠다.
requestMatchers
특정 리소스에 대해서 권한을 설정
// 스프링부트 3.1 이후
.requestMatchers("/login**","/web-resources/**","/actuator/**")permitAll
requestMatchers로 설정한 리소스의 접근을 인증절차 없이 허용
.requestMatchers("/login**", "/web-resources/**", "/actuator/**").permitAll()hasAnyRole
리소스 ‘admin’ 으로 시작하는 모든 URL은 인증후 ADMIN 레벨의 권한을 가진 사용자만 접근 허용
.requestMatchers("/admin/**").hasAnyRole("ADMIN")hasAuthority(String authority)
ROLE_USER, ROLE_ADMIN 등 지정한 권한 허용
hasAnyAuthority(String... authorities)
ROLE_USER, ROLE_ADMIN 등 지정한 권한이 하나라도 있으면 허용hasIpAddress(String ipaddressExpression)
지정한 ip 주소 허용anonymous()
익명 사용자 허용rememberMe()
rememberMe 인증 사용자 허용denyAll()
모두 허용 안함authenticated()
인증된 사용자 허용fullyAuthenticated()
인증된 사용자 허용, rememberMe 인증 제외
과제코드확인
지금 jwt필터랑 AuthUserArgumentResolver의 내용으 ㄹ바탕으로 SecurityConfig 내용을 채워야하니깐
얘네들이 지금 뭘 하고있는지 확인해보자jwtFilter>>
AuthUserArgumentResolver>>
보면 @Auth를 @AuthenticationPrincipal 처럼 쓰고있는데
굳이굳이 @AuthenticationPrincipal 이걸로 바꿀필요가있나?? 그냥 놔둘까싶음..
그럼 jwtFilter 부분만 일단 추가해보겠담

이전에 팀프로젝트했을때 jwt담당하신분듸 코드를 많이 훔쳐봤다.
솔직히 제일위에 basic auth, 2번, 3번, 6번, 9번은 거의똑같이 사용하는 것 같다.
여기서 추가? 해야할 게 7번에 예외처리 커스터마이징인데
jwtFilter를 보면 따로 예외를 안만들어주고 바로 response를 때리고있기 때문에 흉내내보겠다
필터는 GlobalExceptionHandler를 못쓰기 때문이다.........

UsernamePasswordAuthenticationFilter = 사용자가 로그인 폼으로 보낸 ID/PW를 받아서, 인증 시도하고, 성공하면 인증 객체(SecurityContext)에 저장하는 필터
로그인폼으로 로그인 시도할 때 요청을 가로채서 인증해주는 필터임
요청에서 ID, PW를 추출하고 결과 값을 SecurityContextHolder에 인증 정보를 저장(성공) 하거나 예외 응답을 처리하게 됨
JWT 기반 인증을 쓸 경우 이 필터를 쓰지 않거나, 비활성화하고 JWT 필터를 직접 구현해야하기 때문에
UsernamePasswordAuthenticationFilter가 실행되기 전에 JwtFilter를 실행시킨다 << 를 추가해줘야 한다.
UsernamePasswordAuthenticationFilter는 1. 세션기반 인증 전제
👉 그래서 sessionCreationPolicy(SessionCreationPolicy.STATELESS)와 충돌
게다가 2.JWT 인증은 커스텀 필터로 구현해야 함
JWT는 다음 작업이 필요함:
이건 UsernamePasswordAuthenticationFilter가 할 수 있는 일이 아님
추가로

이거 비활성화 따라해줬는데
이 역할이
브라우저에서 로그인 폼(form)을 제출하는 로그인인 경우에 사용하는 기능인데
jwt기반에는 토큰을 던지기 때문에 사용을안한다고함
이것도 UsernamePasswordAuthenticationFilter를 쓰지않을 때 안씀
Spring Security에서 예외 처리는 다음과 같은 아키텍처로 이루어진다.
FilterChain
Spring Security는 FilterChain으로 구성되어 있으며, 각 필터는 요청을 처리하거나 다음 필터로 전달한다. 예외가 발생하면 예외 처리 필터가 작동한다.ExceptionTranslationFilter
해당 필터는 예외를 Spring Security 예외로 변환하고, 적절한 AuthenticationEntryPoint 또는 AccessDeniedHandler를 호출한다. 이 필터는 이 둘을 주입받아 사용한다.AuthenticationEntryPoint
AuthenticationEntryPoint는 인증되지 않은 요청에 대한 처리를 담당한다. 일반적으로 로그인 페이지로 리디렉션 하거나 401 Unauthorized 응답을 반환한다.AccessDeniedHandler
AccessDeniedHandler는 인가되지 않은 요청(권한 부족)에 대한 처리를 담당한다. 일반적으로 403 Forbidden 응답을 반환한다.

필터에 있는 내용을 모방해서 써봤다..
대충 Config를 이런식으로 쓰는군! 까지정도만 이해했는데
제대로 활용하려면
OAuth나 AuthenticationPrincipal 에 대해서도 공부가 필요할텐데 잘 모르겠다 하하하하하하하하하
ㅊㅊ
https://velog.io/@oosedus/Spring-Security-시큐리티-동작-원리
https://velog.io/@ky0_hw/Spring-Spring-Security의-동작원리
https://jiwondev.tistory.com/244
https://velog.io/@woojjam/Spring-Security-HttpSecurity-%EC%84%A4%EC%A0%95
이때까지 같이한 모든 프로젝트의 SecurityConfig 내용 보기
https://backend-jaamong.tistory.com/169
https://youtu.be/ov84EoU0KAE?si=Fsqrz4DaCeSJ9jia << 시리즈있음
진짜 너무 어려워요 시큐리티...