2. Fake Login]Spring Security for REST API with Spring Boot 3

손지민·2023년 12월 6일

Spring Security

목록 보기
2/11
post-thumbnail

개요

iOS 와의 협업으로 인해 Spring Security 를 Spring Boot 3으로 REST API 로 만들기 위해 공부하는 과정을 기록하고자합니다.

이 단계에서는 정보가 담긴 요청을 받으면 해당 정보를 담은 JWT 토큰을 만들고, JWT토큰을 응답해봅니다. postman 과 jwt.io 를 활용하여 로그인 endpoint에 접근했을 때 토큰을 확인해봅니다.

공부중이므로 틀린 내용, 의견, 질문 있으시면 댓글 남겨주시면 감사하겠습니다.

전체 구조

1. Fake Login

로그인 폼을 지우고 프론트로부터 받을 요청과 응답 시 전달할 JWT 토큰 등을 Postman을 통해 임의로 주고받아본다.


1.1. AuthController 생성

1.1.1. 코드

package com.ward.ward_server.controller;

import com.ward.ward_server.model.LoginRequest;
import com.ward.ward_server.model.LoginResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class AuthController {

    @PostMapping("/auth/login")
    public LoginResponse login(@RequestBody @Validated LoginRequest request){
        return LoginResponse.builder()
                .accessTocken("Bla bla bla")
                .build();
    }
}

1.1.2. 설명

FakeLogin을 할 컨트롤러 생성

  1. @RestController: 이 어노테이션은 클래스가 HTTP 요청을 처리하는 컨트롤러임을 나타냅니다. @Controller@ResponseBody 어노테이션을 결합한 것으로, HTTP 응답을 직접 처리하는 컨트롤러를 정의할 때 사용됩니다.

  2. @RequiredArgsConstructor: 롬복(Lombok) 어노테이션으로, 필드에 대한 생성자를 자동으로 생성합니다. 여기서는 final@NonNull으로 표시된 필드에 대한 생성자를 생성합니다.

  3. @PostMapping("/auth/login"): 이 어노테이션은 HTTP POST 요청을 /auth/login 엔드포인트에 매핑합니다. 해당 엔드포인트로 POST 요청이 전송되면 login 메서드가 호출됩니다.

  4. public LoginResponse login(@RequestBody @Validated LoginRequest request): 이 메서드는 /auth/login 엔드포인트와 매핑되어 있으며 POST 요청을 처리합니다. 메서드는 LoginRequest 객체를 요청 본문으로 받습니다. @RequestBody 어노테이션은 request 매개변수가 HTTP 요청의 본문과 매핑되어야 함을 나타냅니다.

    • @Validated: 이 어노테이션은 LoginRequest 객체의 유효성 검사를 활성화합니다. LoginRequest 클래스에서 정의된 유효성 제약 조건이 적용됩니다.
    • 메서드는 LoginResponse 객체를 반환합니다. 이 객체는 Lombok@Builder 어노테이션을 사용하여 생성되며, accessToken 필드를 임의의 값으로 초기화합니다.

1.2. LoginRequest 생성

1.2.1. 코드

package com.ward.ward_server.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LoginRequest {
    private String email;
    private String password;
}

1.2.2. 설명

로그인 시 받을 이메일과 비밀번호를 받을 클래스 생성

  • @Getter: 롬복(Lombok) 어노테이션으로, 클래스에 대한 모든 필드에 대한 Getter 메서드를 자동으로 생성합니다. 이를 통해 email 및 password 필드에 접근할 때 간단한 Getter 메서드를 사용할 수 있습니다.

  • @Builder: 롬복 어노테이션 중 하나로, 빌더 패턴을 자동으로 생성합니다. 이를 통해 객체를 생성할 때 각 필드에 대한 값을 체인 형식으로 설정할 수 있습니다. LoginRequest.builder().email("example@example.com").password("secret").build()와 같이 사용할 수 있습니다.

  • @NoArgsConstructor: 롬복 어노테이션으로, 파라미터가 없는 기본 생성자를 자동으로 생성합니다. 이는 주로 프레임워크에서 객체를 생성하거나 매핑할 때 사용됩니다.

  • @AllArgsConstructor: 롬복 어노테이션으로, 모든 필드를 파라미터로 받는 생성자를 자동으로 생성합니다. 이 생성자는 객체를 초기화할 때 모든 필드 값을 한 번에 설정할 수 있습니다.


1.3. LoginResponse 생성

1.3.1. 코드

package com.ward.ward_server.model;

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class LoginResponse {
    private final String accessTocken;
}

1.3.2. 설명

이 클래스는 주로 로그인 API에서 서버에서 클라이언트로 전송되는 응답 데이터를 담는 데 사용될 것입니다.

  • @Getter: 롬복(Lombok) 어노테이션으로, 클래스에 대한 Getter 메서드를 자동으로 생성합니다. 이를 통해 accessToken 필드에 접근할 때 간단한 Getter 메서드를 사용할 수 있습니다.

  • @Builder: 롬복 어노테이션 중 하나로, 빌더 패턴을 자동으로 생성합니다. 이를 통해 객체를 생성할 때 각 필드에 대한 값을 체인 형식으로 설정할 수 있습니다. LoginResponse.builder().accessToken("Bla bla bla").build() 와 같이 사용할 수 있습니다.


1.4. WebSecurityConfig 수정

  • .requestMatchers("/auth/login").permitAll() 추가
    로그인 화면은 모든 사용자가 접근 가능해야하니, 모두 허용으로 수정

1.4.1. 코드

package com.ward.ward_server.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    @Bean
    public SecurityFilterChain applicationSecurity(HttpSecurity http) throws Exception {
        http
                .cors(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .securityMatcher("/**") // map current config to given resource path
                .sessionManagement(sessionManagementConfigurer
                        -> sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .formLogin(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(registry -> registry // 요청에 대한 권한 설정 메서드
                        .requestMatchers("/").permitAll() // / 경로 요청에 대한 권한을 설정. permitAll() 모든 사용자, 인증되지않은 사용자에게 허용
                        .requestMatchers("/auth/login").permitAll()
                        .anyRequest().authenticated() // 다른 나머지 모든 요청에 대한 권한 설정, authenticated()는 인증된 사용자에게만 허용, 로그인해야만 접근 가능
                );

        return http.build();
    }
}

1.4.2. 설명

.requestMatchers("/auth/login").permitAll()
로그인 경로는 인증 안해도 사용할 수 있도록 한 줄 추가했습니다.


1.5. JWTIssuer 생성 전 JWT 라이브러리 추가

implementation("com.auth0:java-jwt:4.4.0")
build.gradle.kts 에 위 내용 한 줄 추가해줬습니다.
저 같은 경우는 gradle-Kotlin 사용 중이라 위와 같이 썼습니다.
(Maven 이나 gradle-groovy 쓰시는 분은 해당 빌더에 맞게 작성하시면 됩니다.)

1.5.1. 만난 문제

  • 처음에는 유튜브에서 implementation("com.auth0:java-jwt:4.2.2") 버전을 4.2.2로 추가하라길래 그대로 추가했습니다. 그러고 다음 단계 JWTissuer 클래스 생성하고 JWT import 가 import com.auth0.jwt.JWT; 이게 떠야하는데 계속 안 떠서 헤맸습니다.

  • 해결 : Maven Repository 들어가서 가장 최신 버전으로 추가했더니 적용 됐습니다.


1.6. JWTIssuer 클래스 생성

  • 이 코드는 JWT(JSON Web Token)를 발급하는 클래스인 JwtIssuer를 정의한 것입니다. JWT는 웹 토큰 표준으로, 클레임(claim) 정보를 포함한 암호화된 토큰을 생성하여 안전하게 정보를 전달하는 데 사용됩니다.
  • 이 클래스는 주로 사용자 인증 후, 사용자에게 JWT를 발급하여 클라이언트 측에서 이 토큰을 저장하고 인증된 요청에 사용하는 데 활용될 것입니다. 서버는 이 토큰을 검증하여 클레임에 있는 정보를 활용할 수 있습니다.

1.6.1. 코드

package com.ward.ward_server.security;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;

@Component
public class JwtIssuer {
    public String issue(long userId, String email, List<String> roles) {
        return JWT.create()
                .withSubject(String.valueOf(userId))
                .withExpiresAt(Instant.now().plus(Duration.of(1, ChronoUnit.DAYS))) // 보통 duration 짧게 하는데 튜토리얼이니까 1day
                .withClaim("e", email)
                .withClaim("a", roles)
                .sign(Algorithm.HMAC256("secret"));
    }
}

1.6.2. 설명

  1. issue 메서드:
  • 역할: JWT를 발급하는 역할을 합니다.
  • 매개변수:
    • userId: 사용자의 고유 식별자로, JWT의 주체(Subject)로 설정됩니다.
    • email: JWT에 포함될 사용자 이메일 정보입니다.
    • roles: 사용자의 역할 정보로, 리스트 형태로 제공됩니다.
  • 반환값: JWT 토큰 문자열입니다.
  1. JWT 빌더 (JWT.create()):
  • JWT.create() 를 호출하여 JWT 빌더 객체를 생성합니다.
  1. JWT 클레임 설정 (withSubject, withExpiresAt, withClaim):
  • withSubject: JWT의 주체(Subject)를 설정합니다.
  • withExpiresAt: 토큰의 만료 시간을 설정합니다. 현재 시간에서 1일 후로 설정되어 있습니다.
  • withClaim: 사용자 지정 클레임을 설정합니다. 여기서는 이메일(e)과 역할(a)을 클레임으로 설정합니다.
  1. JWT 서명 (sign):
  • sign(Algorithm.HMAC256("secret")) 을 통해 JWT를 서명합니다. 여기서 사용된 알고리즘은 HMAC256이며, 서명에 사용되는 시크릿 키는 "secret" 입니다.

1.6.3. 주의

  1. 실제 서비스에서는 보안을 강화하기 위해 시크릿 키 관리 및 토큰 유효 기간 등을 신중히 다뤄야 합니다.
    현재는 secrets 를 하드코딩 하였는데, 보안상 절대 이렇게 하면 안됩니다.
    추후에 Spring Configuration properties 로 변경해야합니다.

  2. 토큰 만료 기간도 1일로 할지 더 짧게 할지 고려해야합니다.

    • 일반적으로, 웹 애플리케이션에서는 토큰의 만료 기간을 상대적으로 짧게 유지하는 것이 권장됩니다. 예를 들어, 15분에서 1시간 정도의 만료 기간을 설정하는 것이 일반적입니다. 모바일 애플리케이션이나 장기적인 인증이 필요한 경우에는 더 긴 만료 기간을 선택할 수 있습니다.
    • 주의할 점은 특정 상황이나 보안 정책에 따라 만료 기간을 조절해야 할 수 있으며, 실제 사용 사례에 따라 적절한 값을 선택하는 것이 중요합니다.

1.7. AuthController 에 JWT 의존성 주입

  1. JWT 의존성 주입
  2. JWT(Java Web Token) 발급

1.7.1. 코드

package com.ward.ward_server.controller;

import com.ward.ward_server.model.LoginRequest;
import com.ward.ward_server.model.LoginResponse;
import com.ward.ward_server.security.JwtIssuer;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
public class AuthController {
    private final JwtIssuer jwtIssuer;

    @PostMapping("/auth/login")
    public LoginResponse login(@RequestBody @Validated LoginRequest request){
        var token = jwtIssuer.issue(1L, request.getEmail(), List.of("USER"));
        return LoginResponse.builder()
                .accessTocken(token)
                .build();
    }
}

1.7.2. 설명

private final JwtIssuer jwtIssuer;
컨트롤러에 한 줄 추가했습니다.

  1. @RequiredArgsConstructor는 Lombok에서 제공하는 애노테이션 중 하나로, 주요 필드에 대한 생성자를 자동으로 생성해줍니다. 클래스에 이 애노테이션을 사용하면 해당 클래스의 final이나 @NonNull이 붙은 필드에 대한 생성자가 생성되어, 코드의 간결성을 유지할 수 있습니다.

    • 위의 코드에서 AuthController클래스는 JwtIssuer jwtIssuer 필드를 가지고 있습니다. 이 필드는 final로 선언되어 있으며, @RequiredArgsConstructor가 사용되었기 때문에 해당 필드를 초기화할 수 있는 생성자가 자동으로 생성됩니다. 따라서 AuthController 클래스의 생성자는 다음과 같이 생성됩니다.
    • 이렇게 생성자가 자동으로 생성되면 JwtIssuer 필드에 대한 의존성 주입을 간단하게 처리할 수 있습니다. 코드의 가독성을 높이고 필드 추가 및 변경 시에도 생성자를 직접 작성하지 않아도 되므로 유지보수 측면에서 편리합니다.
    @RequiredArgsConstructor
    public class AuthController {
        private final JwtIssuer jwtIssuer;
    
        // 자동 생성된 생성자
        public AuthController(JwtIssuer jwtIssuer) {
            this.jwtIssuer = jwtIssuer;
        }
    
        // 나머지 코드는 생략
    }
    
  2. @RequestBody @Validated LoginRequest request: HTTP 요청의 본문(body)을 자바 객체로 매핑하고, 이를 메서드의 파라미터로 전달합니다. @Validated는 입력값의 유효성을 검증하라는 의미이며, LoginRequest는 사용자의 로그인 정보를 나타내는 모델 클래스입니다.

  3. jwtIssuer.issue(1L, request.getEmail(), List.of("USER")): JwtIssuer 클래스의 issue 메서드를 호출하여 JWT(Java Web Token)를 발급합니다. 여기서는 사용자의 ID(1L), 이메일 및 역할 정보를 기반으로 JWT를 생성합니다.

  4. LoginResponse.builder().accessTocken(token).build(): JWT를 포함한 응답 객체를 생성합니다. LoginResponse 클래스는 클라이언트에게 반환될 응답을 나타냅니다. 이 응답은 클라이언트가 성공적으로 로그인한 후 받는 JWT를 포함합니다.

이렇게 구성된 컨트롤러 클래스는 사용자의 로그인 요청을 받아 처리하고, 성공적으로 로그인한 경우 JWT를 발급하여 클라이언트에게 반환합니다.

1.7.3. postman, jwt.io를 통한 토큰 발급 확인

  1. 어플 실행 후 postman 으로 email을 JSON 형태로 입력하여 요청 하고 token 응답받기
  2. postman 에서 발급받은 jwt.io 에 token 붙여넣으면 decoded 하여 토큰에 담긴 정보 확인

    현재는 좌측하단에 Invalid Signature 라고 되어있습니다.
    우측 하단에 보이는 하늘색 글씨 입력창에 secret 입력해주면 Signature Verified 로 변경

1.8. secret key 하드코딩한거 properties 로 변경

1.8.1. JwtProperties 코드

package com.ward.ward_server.security;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Getter
@Setter
@Configuration
@ConfigurationProperties("security.jwt")
public class JwtProperties {
    private String secretKey;
}

1.8.2. JwtProperties 설명

  1. @Getter 및 @Setter: Lombok에서 제공하는 애노테이션으로, 자동으로 Getter 및 Setter 메서드를 생성합니다. 이를 통해 secretKey 필드에 접근하고 수정할 수 있습니다.

  2. @Configuration: 이 클래스가 Spring의 구성 클래스임을 나타내는 애노테이션입니다. Spring IoC 컨테이너에 의해 관리되며, 빈으로 등록됩니다.

  3. @ConfigurationProperties("security.jwt"): 이 애노테이션은 application.properties 또는 application.yml과 같은 설정 파일에서 security.jwt 접두사를 가진 속성들을 바인딩합니다. 여기서는 secretKey 속성에 해당합니다.

  4. private String secretKey: JWT에 사용될 비밀 키를 저장하는 필드입니다. application.properties 또는 application.yml 설정 파일에서 security.jwt.secretKey로 설정할 수 있습니다.

이 클래스의 주요 목적은 JwtIssuer나 다른 JWT 관련 구성 요소에서 필요한 JWT 속성을 정의하고, 설정 파일에서 이 값을 읽어와 사용할 수 있도록 하는 것입니다.

1.8.3. application.yaml 코드

저 같은 경우엔 실사용 db, 백업용db 2개로 나누느라 application.yml/application-dev.yml/application-prod.yml 이렇게 3개가 있는데, 그 중에 공통으로 적용하고싶으면 application.yml 에 작성하면 된다고 합니다.

docker 써서 application.yml 이 이렇게 생겼었음.

spring:
  profiles:
    default: dev

security:
  jwt:
    secret-key: common-secret-key
  • common-secret-key 이 부분에 길게 아무거나 써주면됩니다.
  • 이 시크릿 키는 절대 노출되지않도록 합니다.
    • 저는 gitignore를 사용하여 application.yml 을 공유되지않도록 했습니다.

1.8.4. JwtIssuer 코드

package com.ward.ward_server.security;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;

@Component
@RequiredArgsConstructor
public class JwtIssuer {
    private final JwtProperties properties;

    public String issue(long userId, String email, List<String> roles) {
        return JWT.create()
                .withSubject(String.valueOf(userId))
                .withExpiresAt(Instant.now().plus(Duration.of(1, ChronoUnit.DAYS))) // 보통 duration 짧게 하는데 튜토리얼이니까 1day
                .withClaim("e", email)
                .withClaim("a", roles)
                .sign(Algorithm.HMAC256(properties.getSecretKey()));
    }
}

1.8.5. JwtIssuer 설명

  1. @RequiredArgsConstructor 추가
  2. private final JwtProperties properties; 추가
  3. .sign(Algorithm.HMAC256(properties.getSecretKey())); 수정

1. @RequiredArgsConstructor 추가

@RequiredArgsConstructor는 롬복(Lombok) 어노테이션 중 하나로, 클래스에 선언된 final 필드를 가지고 생성자를 생성해주는 역할을 합니다. 이 어노테이션을 사용하면 생성자를 별도로 작성하지 않아도 됩니다.

해당 코드에서 JwtIssuer 클래스는 JwtProperties properties 필드를 가지고 있습니다. 이 필드에 final 키워드가 사용되어 있기 때문에 해당 필드를 초기화하지 않은 채로 인스턴스를 생성할 수 없습니다. 그래서 @RequiredArgsConstructorJwtIssuer 클래스에 있는 final 필드를 초기화할 수 있는 생성자를 자동으로 생성해줍니다.

@RequiredArgsConstructor 어노테이션을 통해 생성된 생성자는 JwtIssuer 클래스의 객체를 생성할 때 JwtProperties 인스턴스를 받아와서 properties 필드를 초기화합니다. 롬복은 이런 형태의 코드를 개발자 대신 자동으로 생성해주는 역할을 합니다.

추가 설명1. 인스턴스를 생성한다.

"인스턴스를 생성한다"는 것은 클래스를 기반으로 메모리에 실제 객체(인스턴스)를 만들어내는 것을 의미합니다. 클래스는 객체를 만들기 위한 일종의 틀이고, 이 틀을 사용하여 실제로 데이터를 담고 있는 객체를 만들어내는 것이 인스턴스 생성입니다.
예를 들어, 다음과 같은 클래스가 있다고 가정해봅시다:

public class Car {
    private String model;
    public Car(String model) {
        this.model = model;
    }
}

여기서 Car 클래스는 자동차를 나타내는 클래스이며, model이라는 필드를 가지고 있습니다. 이 클래스를 사용하여 실제 자동차 객체를 만들기 위해서는 다음과 같이 인스턴스를 생성합니다:

Car myCar = new Car("Toyota");

위 코드에서 new Car("Toyota") 부분이 인스턴스를 생성하는 부분입니다. Car 클래스의 생성자를 호출하여 실제 자동차 객체를 만들고, 이를 myCar 변수에 할당하게 됩니다.
마찬가지로 앞서 말씀드린 JwtIssuer 클래스에서 JwtIssuer jwtIssuer = new JwtIssuer(properties)와 같이 해당 클래스의 인스턴스를 생성할 때 JwtProperties 객체를 필요로 합니다. 롬복의 @RequiredArgsConstructor를 사용하면 이러한 생성자 코드를 개발자가 직접 작성하지 않아도 되도록 해줍니다.

추가설명2. final 이라서 @RequiredArgsConstructor가 필요한거다.

요약. final 이 아니면, @RequiredArgsConstructor 가 필요없다. final 일 때는 초기화해야지만 인스턴스 생성할 수 있어서 @RequiredArgsConstructor 가 필요한거다.

Java에서 final 키워드가 변수 선언 시 사용되면 해당 변수는 "초기화된 후에는 값이 변경될 수 없는(final) 상수"가 됩니다. 이는 생성자나 초기화 블록에서 값을 할당하면 그 이후에는 변경할 수 없다는 것을 의미합니다.
만약 변수가 final로 선언되지 않았다면, 해당 변수는 초기화되지 않은 상태에서도 생성될 수 있습니다. 그러나 해당 변수를 사용하려고 할 때 초기화되어 있지 않으면 컴파일 오류가 발생합니다.

따라서 final 키워드는 변수를 읽기 전용으로 만들어 변경을 방지하고, 초기화 이후에는 불변성을 보장하는 데 사용됩니다.

추가설명3. @RequiredArgsConstructor 는 final, @NonNull 에만 생성자만듬.

@RequiredArgsConstructor를 사용하더라도 모든 필드가 final이거나 @NonNull 애노테이션이 지정된 경우에만 생성자에 포함됩니다.

2,3. .sign(Algorithm.HMAC256(properties.getSecretKey())); 수정

sign(Algorithm.HMAC256(properties.getSecretKey())); 부분은 JSON Web Token (JWT)을 서명하는 부분입니다. JWT는 세 가지 파트로 이루어져 있습니다: Header, Payload, Signature. 이 세 가지 부분은 Base64로 인코딩되어 하나의 문자열로 결합됩니다.

서명은 JWT의 무결성을 보장하기 위해 사용됩니다. 서명은 Header와 Payload의 내용을 이용하여 생성되며, 해당 서명을 통해 JWT가 유효하고 변경되지 않았음을 검증할 수 있습니다.

여기서 Algorithm.HMAC256(properties.getSecretKey())는 HMAC-SHA256 알고리즘을 사용하여 서명을 생성하는데, 이때 필요한 키가 properties.getSecretKey()에서 가져온 값입니다. properties.getSecretKey()JwtProperties에서 설정한 시크릿 키 값이며, 이 값은 JWT를 생성하고 검증하는 데 사용됩니다.

간단히 말해서, JWT를 생성할 때 사용되는 알고리즘과 시크릿 키로 서명을 생성하고, 이 서명은 JWT의 Signature 부분에 추가됩니다. 나중에 JWT를 검증할 때, 동일한 알고리즘과 시크릿 키를 사용하여 서명을 다시 생성하고, 저장된 서명과 비교하여 JWT의 무결성을 확인합니다.

1.8.6. postman 와 jwt.io 로 확인하기

1.9. 미완)@ConfigurationProperties 추가

왜 인지 유튜브 영상 따라했는데 동작을 안합니다. application.yml에서 secret-key 에 대한 설명이 보이게 하기위해 하는 것 같습니다. 일단 기록은 해두겠습니다.
유튜브에서는 이렇게 하면 처리하여 application.yml 에서 secretkey 위에 마우스를 올리면 java docs /**/에 작성한 내용이 보입니다. 저는 실패

  1. build.gradle.kts 에 내용 추가
    annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
  2. Settings-Build,Execution, Deployment-Compiler-AnnotationProccesors 설정-제일 위에 Enable annotation proccesiong 체크
  3. JwtProperties 에 주석 작성하고 application.yml 에서 secret-key 위에 마우스 올리면 작성한 주석 내용이 보여하는데 안보임.
package com.ward.ward_server.security;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Getter
@Setter
@Configuration
@ConfigurationProperties("security.jwt")
public class JwtProperties {
    /**
     * Secret key used for issuing JWT
     */
    private String secretKey;
}

참고

profile
Developer

0개의 댓글