백오피스 과제중 관리자 인증과 CRUD 를 전부 구현한후 다른조원들이 작업하는동안 시간이 남아
Session 기반에 인증과정에서 JWT 기반의 인증 넘어가는걸 직접 살펴봤다
서버가 로그인상태를 직접관리하기때문에 구현이 쉬운 장점이있었지만, 그만큼 유저가 늘어날수록 메모리 사용량이 늘어나면서 서버확장성이 낮아지는 단점을 가지고있었다

Payload 구성
- sub → adminId (토큰의주인)
- email → 사용자 이메일
- role → 관리자 권한
- iat → 발급 시간
- exp → 만료 시간
- signWith → 위조방지 서명
필터는 Controller에 요청이 도착하기 전에 먼저 실행되는 컴포넌트다
필터에서 처리되는 작업들
JWT Filter의 흐름
요청 들어옴
→ Authorization 헤더 확인
→ Bearer 토큰 추출
→ 토큰 유효성 검증
→ 토큰에서 사용자 정보 추출
→ Authentication 객체 생성
→ SecurityContext에 저장
→ 다음 필터 또는 Controller로 이동
여기서 중요한 점은 필터가 직접 컨트롤러를 실행하는 것이 아니라, 인증 정보를 만들어 Spring Security가 사용할 수 있도록 등록한다는 것이다

SecurityContext = 현재 요청의 인증정보를 저장하는 공간
요청이 들어올때마다 필터가 토큰을 검증하고, 그 결과를 SecurityContext에 저장한다
세션 방식:
서버 Session에 사용자 저장
JWT 방식:
매 요청마다 토큰 검증 후 SecurityContext에 사용자 저장
Authentication은 Spring Security가 이해하는 인증된 사용자 정보 객체다
JWT 필터에서는 보통 Security에서 제공되는
UsernamePasswordAuthenticationToken 객체를 사용한다

| 값 | 의미 |
|---|---|
| principal | 로그인 사용자 정보(loginAdmin) |
| credentials | 비밀번호 같은 인증 수단( 이미토큰검증을 했기때문에 null) |
| authorities | 권한 목록 (SUPER_ADMIN) |
필터가 이 사용자가 누군지 인증을했다면
security는 사용자가 API에 접근할 권한이 있는지 확인한다
JWT Filter = 인증(Authentication)
Spring Security = 인가(Authorization)
1. JWT 필터를 Spring Security 필터 체인에 등록
2. 어떤 URL은 공개할지 설정
3. 어떤 URL은 로그인 필요하게 할지 설정
4. 어떤 URL은 특정 ROLE만 가능하게 할지 설정
5. 세션을 사용하지 않는 Stateless 구조로 설정
SecurityConfig는 Spring Security의 보안 규칙을 설정하는 클래스다
내가 사용하는 JWT 방식에서는 기본 클래스 기능을 사용하지 않기에 전부 비활성화했다

| 설정 | 의미 | JWT에서 비활성화하는 이유 |
|---|---|---|
| csrf | 세션/쿠키 기반 공격 방어 | JWT는 Authorization 헤더 사용 |
| formLogin | Spring 기본 로그인 페이지 | REST API에서는 사용하지 않음 |
| httpBasic | ID/PW 기반 기본 인증 | JWT Bearer 토큰 사용 |
JwtProvider
→ 토큰 생성 / 검증 / Claims 추출
JwtAuthenticationFilter
→ 요청마다 토큰 확인
→ 인증 객체 생성
→ SecurityContext 저장
SecurityConfig
→ 어떤 API를 열고 막을지 설정
→ 어떤 Role이 접근 가능한지 설정
로그인 성공
→ JWT 발급
→ 클라이언트가 토큰 저장
→ 요청 시 Authorization 헤더에 토큰 전달
→ JWT Filter가 토큰 검증
→ SecurityContext에 인증 정보 저장
→ Spring Security가 권한 확인
→ Controller 실행
JWT , 필터 , security에 내부클래스들이 많아서 그 기능을 어느정도 알아보는데 정말헷갈렸다
거기다가 쓰는 방법도 정말다양하고 인터넷에 검색했을때 옛버전으로 작업했던 부분이 많아서 찾아보는게 정말 헷갈렸다 그러면서 session 기반에 단순한 보안구조와 JWT 의 여러역활이 분리된 보안구조를 보면서 확실히 각각이 장점을 느낀거같다
보안 설계구조를 이해하는 경험이 머리가 아팠지만 재밌게 공부했던거같다