spring boot // Springboot-Security-JWT 프로젝트 분석
연구할 프로젝트
https://github.com/codingspecialist/Springboot-Security-JWT
application.yml
ssl의 특징인 포트번호 443이 보임( 맞나? )
키
키저장소비밀번호
키저장소타입
키별명
BootSecurityApplication.java
Connector를 만든 이유는 http와 https를 같이 쓰기 위함인 것 같다
postProcessContext도 마찬가지로 http와 https를 같이 쓰기 위함인 것 같다
Connecter 참고 링크
https://velog.io/@max9106/Spring-Boot-%EB%82%B4%EC%9E%A5-%EC%9B%B9-%EC%84%9C%EB%B2%84-z8k66l0suf
postProcessContext 참고 링크
https://kimjongmo.github.io/spring/spring-boot-redirect-http-to-https
PublicRestApiController.java
컨트롤러 클래스 위에 @RequestMapping을 이용함(공통 경로)
다른 도메인에서도 접근가능 하도록 @CrossOrigin 사용
@RequestMapping 참고 링크
https://woolbro.tistory.com/43
@CrossOrigin 참고 링크
http://jmlim.github.io/spring/2018/12/11/spring-boot-crossorigin/
DbInit.java
DB를 초기화 하는 것 같은 이름이다
CommandLineRunner는 스프링 구동시 사용할 코드들을 적는 기능을 포함한다
유추해보면 유저데이터를 모두삭제하고 역할별로 3개를 넣은듯 하다
UserPrincipal.java
getAuthorities에 permissions와 roles를 둘다 담았다
SecurityConfiguration.java
아래링크에 따르면
@Bean 외부 라이브러리 등 개발자가 직접 제어불가능한 것들을 Bean으로 만들 때 사용
@Component 는 개발자가 직접 만든 클래스를 Bean으로 등록하기 위함
DB 관련 내용으로
데이터베이스 인증용 Provider 라고함
1. csrf 기능을 무효화하고 세션을 Stateless 상태로바꿈
2. authentication 인증, authorization 권한을 무엇으로 설정할지 세팅
3. URI 입장권한
@Bean 참고 링크
https://galid1.tistory.com/494
DaoAuthenticationProvider 참고 링크
https://javaiyagi.tistory.com/431
JwtProperties.java
SECRET은 비밀코드인듯
JwtAuthenticationFilter.java
JwtAuthenticationFilter : Form Login시 걸리는 Filter이다. UsernamePasswordAuthenticationFilter를 상속한 JwtAuthenticationFilter을 등록하였다. 이 필터는 HttpServletRequest에서 사용자가 Form으로 입력한 로그인 정보를 인터셉트해서 AuthenticationManager에게 Authentication 객체를 넘겨준다.
UsernamePasswordAuthenticationFilter : HttpServletRequest에서 사용자가 보낸 아이디와 패스워드를 인터셉트
AuthenticationManager(ProviderManager) : 아이디 패스워드를 UsernamePasswordAuthenticationToken(인증용 객체)로만들어서 전달하면 UserDetailsService가 UserDetails를 만들어 줄것이다
attemptAuthentication : Authentication을 리턴 (securitycontextholder, securitycontext 에 담는 것?)
successfulAuthentication : 헤더에 JWT 헤더스트링과 토큰을 추가하는 듯함
참고 링크
https://javaiyagi.tistory.com/431
참고 링크
https://coding-start.tistory.com/153
JwtAuthorizationFilter.java
JwtAuthorizationFilter : Form Login에서 인증된 이후의 요청에 대해 Header 인증을 담당할 Filter이다.
BasicAuthenticationFilter 는 헤더만 분석하는 필터이다
BasicAuthenticationFilter를 상속한 JwtAuthorizationFilter를 등록하였다. JWT 기반 인증에서 실제 JWT 토큰의 인증이 이루어질 필터 부분이다.
Authentication은 스프링 내부에서만 사용하는 Authentication이다.
JwtToken안에 있는 payload 즉, Claims를 꺼내고 권한정보까지 만들어 인증처리된 Authentication을 생성한다.
생성한 Authentication을 SecurityContextHolder에 저장한다.
스프링의 나머지 FilterChain들을 수행할 수 있도록 doFilter(request,response)를 호출한다.
getUsernamePasswordAuthentication : JWT에서 Authentication을 추출하는 듯함
참고 링크
https://mia-dahae.tistory.com/122
LoginViewModel
로그인 전용 모델인가?
--------------
세션 방식??
1. AuthenticationFilterAnotherParam Bean 등록
2. UsernamePasswordAuthenticationFilter 등록
3. attemptAuthentication 메서드에서 넘어온 데이터를 session에 저장
4. 인증 성공 시 successfulAuthentication에서 setAuthenticationSuccessHandler를 등록
5. Controller에서(SuccessHandler에서 지정한 url) session에 저장한 데이터 사용
6. 인증 실패 시 unsuccessfulAuthentication에서 3번에서 저장했던 데이터를 Session에서 제거
참고 링크
https://okky.kr/article/358004