본캠프 : JwtFilter - ArgumentResolver 실습 1
[ JwtFilter - ArgumentResolver 실습 ]
(1) JWT 의존성 추가(build.gradle)
// jwt
compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
(2) jwt.secret.key 추가(application.properties)
jwt.secret.key=OFJSU3pod0t2WUxmaXY2Z2ZncjhJQmVtdlo1UWJId3E=
*참고 사이트
CodeIgniter Encryption Keys - Can be used for any other 256-bit key requirement.
RandomKeygen - The Secure Password & Keygen Generator
RandomKeygen is a free mobile-friendly tool that offers a randomly generated keys and passwords you can use to secure any application, service or device.
randomkeygen.com
https://www.base64encode.org/ko
인코딩
Base64 인코딩 및 디코딩 - 온라인
Base64 형식으로 인코딩해보세요. 아니면 다양한 고급 옵션으로 디코딩해보세요. 저희 사이트에는 데이터 변환하기에 사용하기 쉬운 온라인 도구가 있습니다.
www.base64encode.org
(3) JwtUtil 클래스 생성
: 여기까지는 로그인(인증)을 통한 Jwt토큰 발급 가능
이후에 JwtFilter(JWT 유저 데이터 추출/ request.setAttribute) - ArgumentResolver(AuthUser 객체 생성/ request.getAttribute) - Controller로의 전달 과정이 필요하다.
(4) JwtFilter 생성 implements Filter
: Filter에서 default가 아닌 doFilter는 반드시 Implement 해야 한다.
: JWT에 있는 유저 데이터 추출 작업(httpRequest.setAttribute)을 진행한다.
(5) FilterConfig로 JwtFilter등록
(6) ArgumentResolver 생성
: JWT에서 추출한 데이터(request.getAttribute)로 AuthUser 객체를 만든다. 비로서 Controller에 전달할 수 있는 데이터가 생성된다.
(7) WebConfig로 ArgumentResolver 등록
(8) AuthUser(dto) 클래스와 Auth(어노테이션) 인터페이스 생성
package com.example.demo.auth.dto;
import lombok.Getter;
@Getter
public class AuthUser {
private final Long userId;
private final String email;
public AuthUser(Long userId, String email) {
this.userId = userId;
this.email = email;
}
}
@Target(ElementType.PARAMETER) // 너 어디 붙을래? 어디에서 사용될래? ArgumentResolver의 파라미터에 쓴다. (Parameter = Argument)
@Retention(RetentionPolicy.RUNTIME) // 표지판을 보려면 RUNTIME이어야 한다. RUNTIME 시에 존재해서 기능을 사용한다.
public @interface Auth { // 표지판
}
(9) Controller에서 ArgumentResolver를 통해 JWT의 유저 정보를 전달 받는다.
: @Auth AuthUser authUser
// 로그인한 유저만 전체 유저를 조회할 수 있는 API
@GetMapping("/users")
public List<UserResponse> getUsers(@Auth AuthUser authUser) {
return userService.findAll();
}