[Spring Boot] JWT 컨트롤

Posted by 김성철

Spring boot - jwt 컨트롤

소스파일 경로 :  
	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에 값을 넣고 그 값을 가져오는 것만 구현되어 있으므로 여기서는  
토큰을 가져와서, 해당 토큰에 내가 저장한 임의의 값을 가져오는 것을 작성함  

JwtTokenUtil.java 파일 수정

- 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);  
	}  
}  
  
=================================================================================================================