[Spring] Spring Security

soohee·2022년 12월 7일
0

Spring

목록 보기
11/13
post-thumbnail

Spring Security란?

Spring Security는 Spring 기반의 애플리케이션의 보안을 담당하는 Spring 하위 Framework이다.
주로, 인증인가에 대한 부분을 filter로 처리하고 있다.
filter는 Dispatcher Servlet으로 가기 전에 먼저 적용되므로, 가장 먼저 URL요청을 받게 된다는 특징을 가지고 있다.

Spring Security의 장점

보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 관련 로직을 작성하지 않아도 된다는 편리성을 제공한다.

Spring Security 아키텍처

Spring Security 처리 구조

  1. Http Request로 인증요청이 온다.
  2. AuthenticationFilter에서 요청을 확인하고, 그 안에 정보를 가지고 UsernamePasswordAuthenticationToken에서 인증용 객체를 생성한다.
  3. AuthenticationManager의 실체적인 구현체인 ProviderManager에게 아까 생성한 객체를 보낸다.
  4. AuthenticationManager는 AuthenticationProvider에게 검증을 위임한다.
    (Manager역할이 필요없다고 느낄 수도 있는데, Priovider는 하나가 아니고 그러므로, Manager가 Provider을 관리하는 것이다.)
  5. UserDetailsService에서 DB에서 사용자 인증정보를 가져와서 UserDetails 객체를 만든다.
  6. AuthenticationProvider에서 UserDetails객체의 인증정보를 비교한다.
  7. 인증이 성공하면, Authentication 객체를 반환한다.
  8. AuthenticationFilter에서 7번의 객체를 반환한다.
  9. SecurityContextHolder가 이 객체를 SecurityContext에 저장한다.

→ Spring Security는 세션-쿠키 기반 인증방법이다.

Spring Security를 통한 JWT 사용

Spring Security를 이용해서 SpringFilterChaindp JWT관련 filter를 추가해서 사용했었다.

JwtAuthenticationFilter

GenericFilterBean을 상속받은 JwtAuthenticationFilter에 있는 doFilter 메소드를 구현해주었다.
이 메로드는 토큰에서 이메일 값을 추출하고, 토큰을 생성하여 Provider에게 인증을 요청하는 역할을 한다.

인증을 마쳤다면, Authentication 객체를 SecurityContext에 저장한다.

JwtProvider

토큰 생성 및 인증에 필요한 메소드를 제공한다.
나는 프로젝트에서 토큰 생성 / 토큰 정보 추출 / 토큰 정보 검증 / 토큰 파싱과 같은 메소드를 구현했었다.

FilterChain

그리고 config에 filter로 걸어주었다.
JWT가 먼저 제대로 된 것인지 판단한 다음에, UsernamePasswordAuthenticationFilter에서 정보를 활용해 토큰을 만들 수 있도록 해주었다.

느낀 점

요즘 면접 준비를 하면서, 단순히 기술을 사용했던 것에 대해 정확히 알고있는지 물어보는 질문들이 많아서, 옛날에 써야겠다고 숨겨놨던 주제를 다시 꺼내서 공부하면서 작성을 해보았다.

profile
🐻‍❄️

2개의 댓글

comment-user-thumbnail
2023년 5월 15일

구현하신 fillterchaining방식에서 addfilterbefore로써 jwtfilter를 거신것에 대한 상징적의미와 내부로직까지 살펴보시면 좋은 학습 기회가 될거 같습니다

답글 달기
comment-user-thumbnail
2023년 5월 15일

Spring Security는 공부해야지 다짐해도 저 아키텍처 사진만 보면 공부할 맛이 뚝 떨어지더라고요..😂
Security Context 개념도 가볍게 살펴보시면 좋을 것 같습니다!

답글 달기