소스파일 경로 :
https://github.com/kkimsungchul/sungchul_ETC/tree/main/src/main/java/com/sungchul/etc/config
JWT 토큰에 사용자의 데이터를 넣어놓은 뒤, 다른곳에서 꺼내서 사용 하는 방법
※ JWT토큰은 base64 로 인코딩되어있어서 디코딩하면 정보가 다보이므로 중요한 정보는 넣어두지말자.
※ 딱 이거하나만 보고서는 이해하기 어려움. 여기까지 작업하고 오는데 남긴 파일만 여러개임
[Spring Boot] Springsecurity 사용하기.txt - https://github.com/kkimsungchul/study/blob/master/Spring%20Boot/%5BSpring%20Boot%5D%20Springsecurity%20%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0.txt
[Spring Boot] Springsecurity 사용하기(DB정보로 로그인).txt - https://github.com/kkimsungchul/study/blob/master/Spring%20Boot/%5BSpring%20Boot%5D%20Springsecurity%20%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0(DB%EC%A0%95%EB%B3%B4%EB%A1%9C%20%EB%A1%9C%EA%B7%B8%EC%9D%B8).txt
[Spring boot] Swagger JWT 인증 사용하기.txt - https://github.com/kkimsungchul/study/blob/master/Spring%20Boot/%5BSpring%20boot%5D%20Swagger%20JWT%20%EC%9D%B8%EC%A6%9D%20%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0.txt
[Spring Boot] JWT 기반 로그인.txt - https://github.com/kkimsungchul/study/blob/master/Spring%20Boot/%5BSpring%20Boot%5D%20JWT%20%EA%B8%B0%EB%B0%98%20%EB%A1%9C%EA%B7%B8%EC%9D%B8.txt
[Spring boot] Springsecurity , JWT , Swagger jwt 적용 로직 분석.txt - https://github.com/kkimsungchul/study/blob/master/Spring%20Boot/%5BSpring%20boot%5D%20Springsecurity%20%2C%20JWT%20%2C%20Swagger%20jwt%20%EC%A0%81%EC%9A%A9%20%EB%A1%9C%EC%A7%81%20%EB%B6%84%EC%84%9D.txt
[Spring Boot] JWT 기반 로그인.txt 파일에서는 JwtTokenUtil 을 구현하고,
거기서 token의 subject에 값을 넣고 그 값을 가져오는 것만 구현되어 있으므로 여기서는
토큰을 가져와서, 해당 토큰에 내가 저장한 임의의 값을 가져오는 것을 작성함
- generateToken() 메소드 :
사용자의 정보를 claims 맵에 담에서 토큰을 생성함
토큰에 넣고싶은 값들은 claims 맵에 전부다 넣어주면 됨
토큰을 생성하는 메소드는 doGenerateToken()임
- getUsernameFromToken() 메소드 :
전달받은 토큰 없이 토큰에 저장된 subject 의 값을 가져옴
토큰값은 헤더에 있기에 getToken() 메소드를 통해서 토큰값을 가져오도록 했음
- getToken() 메소드 :
헤더에 있는 토큰값을 리턴해주는 메소드임
매번 토큰의 정보를 꺼내올때마다 헤더의 값을꺼내는 코드를 작성하지 않고 메소드로 사용하려고 했음
- getUserInfo() 메소드 :
제일 중요함, claims 에 저장한 값을 꺼내오는 메소드임
사용자의 정보를 저장할 때 "USER_INFO" 라는 키값으로 claims 에 저장해놓았음
꺼내쓸때는 getAllClaimsFromToken() 메소드를 통해서 토큰에 있는 값을 파싱한 뒤에 꺼내씀
Map 타입으로 넣었기 때문에 꺼내올때도 map 타입으로 꺼내옴
claims.get("USER_INFO", Map.class);
해당 메소드에서는 Claims 클래스의 get() 메소드를 사용하는데 get() 메소드는 아래와 같이 되어있음
<T> T get(String claimName, Class<T> requiredType);
그래서 넣었던 타입의 이름과, 타입을 넣어줘야함
=================================================================================================================
/**
* jwt token으로부터 user사용자 정보를 획득한다.
* @return Map
*/
public Map getUserInfo() {
final Claims claims = getAllClaimsFromToken(getToken());
return claims.get("USER_INFO", Map.class);
}
/**
* retrieve username from jwt token
* jwt token으로부터 username을 획득한다.
* @return String
*/
public String getUsernameFromToken() {
return getClaimFromToken(getToken(), Claims::getSubject);
}
/**
* generate token for user
* 유저를 위한 토큰을 발급해준다.
* 발급시 사용자의 아이디를 사용함
* @param userDetails
* @param userVO
* @return String
*/
public String generateToken(UserDetails userDetails , UserVO userVO) {
Map<String, Object> claims = new HashMap<>();
claims.put("USER_INFO" , userVO);
return doGenerateToken(claims, userDetails.getUsername());
}
/**
* header에 있는 토큰을 가져옴
* @return String
*/
public String getToken(){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
return request.getHeader("jwt");
}
=================================================================================================================
토큰에 저장된 값을 꺼내서 사용할 클래스에서 jwtTokenUtil 를 추가한 뒤에 jwtTokenUtil.getUserInfo() 메소드를 통해서 가져옴
꺼내온 값은 Map 타입
=================================================================================================================
@Api(tags="UserController")
@AllArgsConstructor
@RestController
public class UserController {
UserService userService;
JwtTokenUtil jwtTokenUtil;
@GetMapping("/user")
public ResponseEntity<ResponseAPI> getUserInfo(){
ResponseAPI responseAPI = new ResponseAPI();
HashMap<String,Object> hashMap = new HashMap<>();
hashMap.put("userInfo",jwtTokenUtil.getUserInfo());
responseAPI.setData(hashMap);
return new ResponseEntity<>(responseAPI, HttpStatus.OK);
}
}
=================================================================================================================