coding-start.tistory.com/153

 

Spring boot - Spring Security(스프링 시큐리티) 란? 완전 해결!

오늘 포스팅할 내용은 Spring Security이다. 사실 필자는 머리가 나빠서 그런지 모르겠지만, 아무리 구글링을 통해 스프링 시큐리티를 검색해도 이렇다할 명쾌한 해답을 얻지 못했다. 대부분 이론적

coding-start.tistory.com

위 블로그의 내용을 간단히 해보았다.

먼저 스프링 시큐리티

스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증과 권한,인가 등)을 담당하는 스프링 하위 프레임워크이다. 주로 서블릿 필터와 이들로 구성된 필터체인으로의 위임모델을 사용한다. 그리고 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다

출처: https://coding-start.tistory.com/153 [코딩스타트]

 

FORM 기반 로그인 플로우

1. 사용자가 FORM을 통해 로그인 정보 입력 후 인증 요청

2. AuthenticationFilter가 WAS에서 생성한 HttpServletRequest 객체를 인터셉트. 객체 안 정보들을 인증용 객체(UsernamePasswordAuthenticationToken)으로 만들어서 AuthenticationManager에게 위임

3. 전달받은 인증용 객체를 AuthenticationProvider에게 전달.

4. UserDeatailsService에게 사용자 아이디를 넘겨주고, 그 사용자 아이디에 따른 사용자 정보를 UserDetails라는 객체로 전달받는다. 

5. AuthenticationProvider는 UserDetails 객체를 전달받은 이후 실제 사용자의 입력정보와 UserDetails 객체를 가지고 인증을 시도한다.

6. 인증이 완료되면 Authentication 객체를 SecurityContextHolder에 담은 이후 Handler를 실행한다.

 

이는 스프링 시큐리티의 기본적은 로그인 시 플로우이다.

여기서 SSHJ는 JWT Token을 이용하기 때문에 필터를 Customizing하였다.

스프링 시큐리티가 제공하는 Filter chain이 존재하고, 이를 커스터마이징 하기 위해서는 해당 filter를 implement나 override하여 구현한다.

여기서 커스터마이징 할 부분은 AuthenticationFilter 부분이고, 플로우 또한 바꾸었다. 기존에는 토큰에서 받아온 정보와 DB에 저장된 사용자 정보를 비교하였는데, 이는 토큰의 사용 의의와 모순되는 부분이라 과정을 생략하였다. 즉, 토큰의 유효성(만료기간, 블랙리스트에 존재하지 않음)만을 따져 UsernamePasswordAuthenticationToken을 리턴하여 SecurityContextHolder에 저장하여 다음 filter에게 보낸다.

이 때 UserHeaderModel이라는 모델 객체를 만들어 인증에 성공한 Authentication 객체의 정보들을 하나씩 담아 Request의 속성으로 담아 보낸다. 

즉 request마다 토큰의 유효성을 검사한 뒤 토큰 안의 정보들을 담아 보내 해당 api에서 자유롭게 쓸 수 있게 된다.