인프런 강의/Spring Boot JWT Tutorial

Spring Boot JWT Tutorial - 4, 5

숲별 2022. 10. 13. 01:56
728x90

Token 정보를 Response할 때 사용할 TokenDto

JpaRepository를 extends하면 findAll, save 등의 메소드를 기본적으로 사용할 수 있게 됨.

 

findOneWithAuthoritiesByUsername 메소드는 username을 기준으로 User 정보를 가져올 때 권한 정보도 같이 가져오게 됨.

 

@EntityGraph는 쿼리가 수행이 될 때 Lazy 조회가 아니고 Eager조회로 authorities 정보를 같이 가져오게 됨.

 

Spring Security에서 중요한 부분 중 하나인 UserDetailsService를 구현한 CustomUserDetailsService 클래스를 생성

 

UserDetailsService를 implements하고 UserRepository를 주입

loadUserByUsername 메소드를 오버라이드해서

로그인 시에 DB에서 유저정보와 권한정보를 가져오게 됨.

해당 정보를 기반으로 userdetails.User객체를 생성해 리턴

 

AuthController는 TokenProvider, AuthenticationManagerBuilder를 주입

로그인 api경로는 /api/authenticate이고 Post요청을 받는다.

LoginDto의 username, password를 파라미터로 받고

이를 이용해 UsernamePasswordAuthenticationToken을 생성

authenticationToken을 이용해서 Authentication객체를 생성하려고 authenticatie 메소드가 실행될 때

loadUserByUsername 메소드가 실행

Authentication 객체를 생성하고 이를 SecurityContext에 저장하고 Authentication 객체를 createToken 메소드를 통해서 JWT Token을 생성

JWT Token을 Response Header에도 넣어주고 TokenDto를 이용해서 Response Body에도 넣어서 리턴

 

 

(참고)postman 유용한 기능

Test 탭에서 Response의 데이터를 포스트맨 전역변수(pm.global)에 저장해서 다른 Request에서 사용가능

var jsonData = JSON.parse(responseBody)
pm.global.set("jwt_tutorial_token", jsonData.token);

 

5. 회원가입, 권한 검증

--SecurityUtil.java

getCurrentUsername메소드의 역할은 Security Context의 Authentication 객체를 이용해 username을 리턴해주는 간단한 유틸성 메소드

Security Context에 Authentication 객체가 저장되는 시점은 JwtFilter의 doFilter 메소드에서 Request가 들어올 때 SecurityContext에 Authentication 객체를 저장해서 사용

회원가입, 유저정보조회 등의 메소드를 만들기 위해 UserService 클래스를 생성

UserService는 UserRepository, PasswordEncoder 주입

signup 메소드는 회원가입 로직을 수행하는 메소드

 

username이 DB에 존재하지 않으면 Authority와 User 정보를 생성해서 UserRepository의 save메소드를 통해 DB에 정보를 저장

 

여기서 중요한 점은 signup 메소드를 통해 가입한 회원은 USER ROLE을 가지고 있고

data.sql에서 자동 생성되는 admin 계정은 USER, ADMIN ROLE을 가지고 있다.

이 차이를 통해 권한 검증 부분을 테스트

 

유저, 권한정보를 가져오는 메소드가 2개

getUserWithAuthorities는 username을 기준으로 정보를 가져오고

getMyuserWithAuthorities는 SecurityContext에 저장된 username의 정보만 가져옴.

 

UserService의 메소드들을 호출할 UserController를 생성.

 

sign up 메소드는 UserDto 객체를 파라미터로 받아서 UserService의 signup메소드를 호출

getMyUserInfo 메소드는 @PreAuthorize를 통해 USER, ADMIN 두가지 권한 모두 허용

getUserInfo 메소드는 ADMIN 권한만 호출 할 수 있도록 설정.

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-jwt

 

[무료] Spring Boot JWT Tutorial - 인프런 | 강의

Spring Boot, Spring Security, JWT를 이용한 튜토리얼을 통해 인증과 인가에 대한 기초 지식을 쉽고 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

 

 

 

https://github.com/SilverNine/spring-boot-jwt-tutorial