Spring Security 파헤치기

Sihwan Kim·2024년 2월 29일
0

Spring

목록 보기
4/6

Spring Security

인증/인가를 쉽게 만들어주는 프레임워크❗❗

Spring Security필터(Filter)기반으로 동작하는데, 이를 이해하려면 DispatcherServeltInterceptor부터 이해해야한다.

🚨아래 내용은 위 사진을 참고하면 좋다🚨

✈ Controller까지 가는 길은

Filter -> Dispatcher Servlet -> Interceptor -> Controller이다.


Dispatcher Servlet

🚒 Dispatcher Servlet은 HTTP요청을 받아서 요청에 맞는 컨트롤러로 연결해주는 역할을 한다.

장점

- 과거에는 URL 매핑을 수동으로 등록해야했지만, Dispatcher Servlet의 등장으로 쉽게 핸들링할 수 있다.

동작과정 요약

Dispatcher Servlet클라이언트의 요청을 받음. -> Handler Mapping, HandlerAdapter를 통해 Handler에게 요청 전달. -> 요청에 맞는 컨트롤러에게 위임. -> 비즈니스 로직 -> 컨트롤러어댑터로 반환값 반환 -> 어댑터Dispatcher Servlet으로 반환 -> 클라이언트에게 반환.


Interceptor

😋 컨트롤러 직전직후에서 요청과 응답을 가로채서 원하는 동작을 추가하는 역할을 하는 친구

preHandle(request, response, handler)

🌘 지정된 컨트롤러의 동작 이전에 가로채는 역할로 사용됨.

postHandle(request, response, handler, modelAndView)

🌒 지정된 컨트롤러의 동작 이후에, Dispatcher Servlet이 화면을 처리하기 전에 동작함.

afterCompletion(request, response, handler, exception)

🌕 DispatcherSerlvet의 화면 처리(뷰)가 완료된 상태에서 처리함.


이제 진짜 Spring Security

Filter

🔔 FilterDispatcher Servlet이 요청을 받기전에 처리한다.

Security Filter Chain

Spring Security는 이러한 Filter를 10개이상 기본적으로 제공한다.
이를 Security Filter Chain이라고 부른다.

기본 Filter는 다음 포스팅에 작성할 예정이다.

인증 아키텍처

AuthenticationFilter

1. 클라이언트(유저)가 로그인 시도.

2. AuthenticationFilterAuthenticationManager, AuthenticationProvider(s), UserDetailsService를 통해 DB에서 사용자 정보를 읽어온다.

🧨 이때 중요한건 UserDetailsService인터페이스라는 것이다. 따라서 해당 인터페이스를 구현한 빈(Bean)을 생성해야한다. 즉, 어떤 데이터베이스에서 어떤 사용자의 정보를 읽어들일지 구현가능.

3. UserDetailsService는 사용자정보를 담아 UserDetails를 구현한 객체를 만들어야한다. UserDetails정보는 세션에 저장하게 된다.

4. 스프링 시큐리티는 인메모리 세션저장소인 SecurityContextHolder 에 UserDetails정보를 저장하게 된다.

5. 클라이언트에게 session ID(JSESSION ID)와 함께 응답을 하게 된다.

6. 이후 요청에서는 요청 쿠키에서 JSESSION ID정보를 통해 이미 로그인 정보가 저장되어 있는 지 확인한다. 이미 저장되어 있고 유효하면 인증 처리를 해주게 된다.

JSESSIONID란?

톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키
HTTP 프로토콜stateless하다. 따라서, 상태를 저장하기 위해서 톰캣은 JSESSIONID 쿠키를 클라이언트에게 발급해주고 이 값을 통해 세션을 유지할 수 있도록 한다.

👍참고

https://gngsn.tistory.com/153
https://hello-judy-world.tistory.com/216
https://www.boostcourse.org/web326/lecture/58997?isDesc=false![](https://velog.velcdn.com/images/van1164/post/8e515ad6-db2c-4b11-ba2f-2e68138193f4/image.png)

0개의 댓글