sunny920111 / demo

0 stars 0 forks source link

로그인 인증 #2

Open sunny920111 opened 9 months ago

sunny920111 commented 9 months ago

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

sunny920111 commented 9 months ago

jwt secret Key 생성하는 방법

import java.security.SecureRandom;

public class JwtKeyGenerator {
    public static void main(String[] args) {
        SecureRandom random = new SecureRandom();
        byte[] keyBytes = new byte[64]; // 키 길이를 조절할 수 있습니다.

        random.nextBytes(keyBytes);

        String base64EncodedKey = java.util.Base64.getEncoder().encodeToString(keyBytes);
        System.out.println("JWT Key: " + base64EncodedKey);
    }
}

OncePerRequestFilter

`OncePerRequestFilter`는 Spring Framework에서 사용되는 클래스이며, 서블릿 기반 웹 애플리케이션에서 HTTP 요청을 처리하는 데 도움을 주는 역할을 합니다. 이 클래스는 Spring Security와 같이 사용되며, 주로 사용자 인증 및 권한 부여와 관련된 작업을 수행하는 데 유용합니다.

`OncePerRequestFilter` 클래스의 이름에서 알 수 있듯이, 이 필터는 각 HTTP 요청당 한 번만 실행되도록 보장합니다. 이것은 일부 작업을 한 번만 수행하고자 할 때 유용하며, 예를 들어 사용자의 인증 상태를 확인하거나 요청에 대한 보안 검사를 수행할 때 사용됩니다.

일반적으로 `OncePerRequestFilter`를 상속받은 사용자 정의 필터 클래스를 작성하고, `doFilterInternal` 메서드를 오버라이딩하여 원하는 작업을 구현합니다. 이 메서드는 각 HTTP 요청에 대해 호출되며, 필터 체인의 다음 필터로 제어를 전달할 수 있습니다.

예를 들어, Spring Security에서 사용자 인증을 처리하기 위해 `OncePerRequestFilter`를 활용할 수 있으며, 요청에 대한 사용자의 권한을 확인하거나 특정 리소스에 대한 접근을 제한하는 데 사용됩니다. 필터 체인의 다른 필터와 함께 사용하여 웹 애플리케이션의 보안을 구현하는 데 도움이 됩니다.
sunny920111 commented 9 months ago

SecurityContextHolder는 Spring Security 프레임워크에서 사용되는 중요한 클래스 중 하나로, 현재 실행 중인 스레드에 대한 보안 관련 정보를 저장하고 제공하는 역할을 합니다. 주로 인증(Authentication) 및 권한 부여(Authorization)와 관련된 작업에서 사용됩니다.

SecurityContextHolder에는 보안 컨텍스트(SecurityContext)가 저장됩니다. 이 컨텍스트는 현재 사용자와 해당 사용자의 인증 정보를 나타내며, 보안 작업에 필요한 정보를 보유하고 있습니다.
sunny920111 commented 9 months ago
EnableEncryptableProperties는 데이터를 암호화하여 저장하고 복호화하여 사용할 수 있도록 하는 기능을 활성화하는 스프링 부트(Spring Boot) 애너테이션 중 하나입니다. 이 애너테이션은 [Jasypt](http://www.jasypt.org/)라는 라이브러리를 통합하여 스프링 부트 애플리케이션에서 설정 값을 보호하고 데이터를 안전하게 저장할 수 있게 해줍니다.

EnableEncryptableProperties를 사용하면 주로 애플리케이션의 중요한 설정 값(예: 데이터베이스 비밀번호, API 키, 암호 등)을 암호화하여 노출을 방지하고, 필요할 때만 복호화하여 사용할 수 있습니다. 이것은 보안을 강화하고 민감한 데이터 노출을 방지하는 데 도움이 됩니다.

애너테이션을 사용하려면 먼저 jasypt-spring-boot 라이브러리를 프로젝트에 추가하고 설정 파일에서 jasypt.encryptor.password 속성을 설정해야 합니다. 이 비밀번호를 사용하여 암호화 및 복호화 작업이 수행됩니다.

예를 들어, application.properties 또는 application.yml 파일에서 다음과 같이 설정할 수 있습니다:

properties

암호화 키 설정
jasypt.encryptor.password=mySecretKey

암호화된 데이터
my.encrypted.property=ENC(암호화된값)

위 설정에서 my.encrypted.property 값은 암호화된 데이터를 나타내며, ENC()로 시작합니다. EnableEncryptableProperties 애너테이션이 활성화되면 해당 값은 자동으로 복호화되어 사용됩니다.

암호화와 관련된 자세한 설정과 사용 방법은 Jasypt 라이브러리 및 스프링 부트 문서를 참조하십시오.
sunny920111 commented 9 months ago
main.js에서 구현 
token 있는지 없는지 체크하는 방법 :localStorage.accessToken 체크
axios.interceptors.request.use
axios.interceptors.response.use
을 통해서 http request or response에서 공통적으로 넣어주고 세팅해줄 수 있다. 

authenticateUser : token없을 때
JwtAuthenticationFilter : token 있을 때
    CustomUserDetailsService : role 가져오는 부분을 위해서 구현 필요
    UserPrincipal : UserDetail에서 Custom하기 위해서 구현 필요
    PropertyEncryptConfig : 암호화 때문에 필요.

router.js 

/ -> redirect : /home -> beforeEnter -> login?returnPath=home.. 
beforeEnter 
    token 있을 경우 - loading - JwtAuthenticationFilter 
    token 없을 경우 - login   - authenticateUser - returnPath : home으로 이동 

-> action을 통해서 store에 user 정보 저장  : this.$store.dispatch('USER_INIT')
store, mutation, action, getter 구현 필요