Server/Spring Boot

spring boot // Springboot-Security-JWT 프로젝트 분석

Jaybon 2020. 8. 6. 21:46

 

연구할 프로젝트

https://github.com/codingspecialist/Springboot-Security-JWT

 

codingspecialist/Springboot-Security-JWT

Contribute to codingspecialist/Springboot-Security-JWT development by creating an account on GitHub.

github.com

 

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

 

[Spring Boot] 내장 웹 서버 - 2 (스프링부트 HTTPS / HTTP2)

HTTPS HTTPS(SSL프로토콜 위에서 돌아가는 프로토콜)을 사용하려면 키스토어(인증서)를 만들어야한다. 티미널을 열어 프로젝트 위치에서 아래의 명령어를 입력한다. `keytool -genkey -alias spring -storetype

velog.io

 

postProcessContext 참고 링크

https://kimjongmo.github.io/spring/spring-boot-redirect-http-to-https

 

스프링부트 HTTP요청을 HTTPS 둘다 사용하기 « Kimjongmo's Blog

스프링부트 HTTPS 적용 스프링 부트 HTTPS 적용시키기 프로젝트에 자가 서명을 이용한 후 http요청을 하게 되면 아래와 같은 응답을 받게된다. 당연히도 해당 포트는 이제 더이상 http요청을 받지않��

kimjongmo.github.io

 

 

PublicRestApiController.java

컨트롤러 클래스 위에 @RequestMapping을 이용함(공통 경로)

다른 도메인에서도 접근가능 하도록 @CrossOrigin 사용

 

@RequestMapping 참고 링크

https://woolbro.tistory.com/43

 

Spring MVC 예제 - @RequestMapping 어노테이션 예제

이번 포스팅은 이전에 작성한 직원 관리 예제를 가지고 설명을 하려고 합니다. [Java/Spring-framework] - Spring MVC 예제 - 직원 관리 프로그램 Spring MVC 예제 - 직원 관리 프로그램 이번 포스팅은 Spring MVC.

woolbro.tistory.com

 

@CrossOrigin 참고 링크

http://jmlim.github.io/spring/2018/12/11/spring-boot-crossorigin/

 

스프링 부트에서 크로스도메인 이슈 처리하기. (@CrossOrigin 어노테이션을 사용) · 기억하기 위한 �

스프링 부트에서 크로스도메인 이슈 처리하기. (@CrossOrigin 어노테이션을 사용) 11 Dec 2018 | Spring CORS Cross Domain 크로스도메인 이슈란? Ajax 등을 통해 다른 도메인의 서버에 url(data)를 호출할 경우 XMLH

jmlim.github.io

 

 

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

 

Spring - @Bean 어노테이션과 @Component 어노테이션(DI) - 2

@Component, @Bean 프로그램이 거대해 짐에 따라 XML 을 이용하여 IOC Container 를 설정하는 것이 점점 어려워졌고 때문에 Annotation(@) 이란 것이 등장했다(이하 어노테이션). 어노테이션은 코드에 메타데��

galid1.tistory.com

 

DaoAuthenticationProvider 참고 링크

https://javaiyagi.tistory.com/431

 

스프링 시큐리티를 이용한 보안 - 1부 인증

현재 맡고 있는 프로젝트의 Rest Api 가 보안이 전혀 돼 있지 않아서, 보안을 강화하는 작업을 시작했다. 보안이 전혀 돼 있지 않기 때문에, 사용자 아이디/비밀번호 정보가 없어도, Rest Api 를 호출�

javaiyagi.tistory.com

 

 

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

 

스프링 시큐리티를 이용한 보안 - 1부 인증

현재 맡고 있는 프로젝트의 Rest Api 가 보안이 전혀 돼 있지 않아서, 보안을 강화하는 작업을 시작했다. 보안이 전혀 돼 있지 않기 때문에, 사용자 아이디/비밀번호 정보가 없어도, Rest Api 를 호출�

javaiyagi.tistory.com

 

참고 링크

https://coding-start.tistory.com/153

 

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

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

coding-start.tistory.com

 

 

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

 

[Authorization]JWT 토큰 사용하여 사용자정보 parsing하기

JWT토큰을 사용하여 사용자를 식별하기 위해 Header에 해당 정보를 넣을 것이다. Header에 다음과 같은 형식으로 전달하고 주고 받을 예정이다. { Authorization: Bearer token } 또한 모든 요청에 대해서 acces

mia-dahae.tistory.com

 

 

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

 

OKKY | spring security에서 로그인 parameter를 추가해서 받을 수 잇나요??

username하고 password가 기본값인데 필요한 추가해서 데이터를 받아서 비교할 순 없나요?? 혹시  가능한지 알고싶고, 가능하면 무엇을 custom해야하는지 알려주시면 감사드립니다.ㅠㅠ

okky.kr