개발/부트캠프

본캠프 : JwtFilter - ArgumentResolver 실습 1

EJ EJ 2025. 3. 11. 20:39

[ 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=

*참고 사이트

https://randomkeygen.com

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