>Java >java지도 시간 >JWT 토큰 및 이메일 재설정 비밀번호를 사용한 로그인 시스템

JWT 토큰 및 이메일 재설정 비밀번호를 사용한 로그인 시스템

Barbara Streisand
Barbara Streisand원래의
2024-11-24 22:48:13335검색

Login system with JWT token and email reset password

소개

Spring 로그인 애플리케이션Spring Boot를 사용하여 구축된 안전하고 강력한 사용자 관리 시스템입니다. 이 프로젝트는 인증, 권한 부여 및 사용자 계정 기능을 구현하는 현대적인 접근 방식을 보여줍니다. 주요 기능에는 사용자 등록, BCrypt를 통한 안전한 비밀번호 처리, 이메일 기반 비밀번호 재설정, JWT(JSON 웹 토큰) 인증이 포함됩니다. 확장성과 확장성을 염두에 두고 설계된 이 애플리케이션은 사용자 관리 및 역할 기반 액세스 제어가 필요한 프로젝트를 위한 탁월한 기반 역할을 합니다.

Spring Security, Spring Data JPAJavaMailSender와 같은 Spring의 강력한 도구를 활용하여 이 프로젝트는 보안, 유지 관리성 및 용이성 측면에서 모범 사례를 보장합니다. 통합의. 소규모 웹 애플리케이션을 구축하든 대규모 엔터프라이즈 시스템을 구축하든 이 프로젝트는 사용자 계정을 안전하게 관리하기 위한 실용적이고 체계적으로 구성된 시작점을 제공합니다.


구성

Pom.xml 종속성

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


도커

PostgreSQL 데이터베이스를 실행하려면 docker-compose.yaml 파일을 생성하세요.

services:
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=database
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

실행:

docker compose up -d

애플리케이션.속성

spring.application.name=login_app

spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=admin
spring.datasource.password=admin

spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525


spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8


spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

spring.config.import=classpath:env.properties

jwt.public.key=classpath:public.key
jwt.private.key=classpath:private.key


환경속성

spring.mail.username=<Get in your mailtrap account>
spring.mail.password=<Get in your mailtrap account>

비대칭 키를 만드는 방법은 무엇입니까?

이 게시물에서 비대칭 키를 생성하는 방법을 확인하세요


프로젝트 구조

login_app/
├── .mvn/                       # Maven folder (Maven configurations)
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── dev/
│   │   │       └── mspilari/
│   │   │           └── login_app/
│   │   │               ├── configs/           # Security, authentication, and other configurations
│   │   │               ├── domains/           # Main application domains
│   │   │               │   ├── email/         # Email-related logic
│   │   │               │   └── user/          # User-related logic
│   │   │               ├── exceptions/        # Custom exceptions and error handling
│   │   │               └── utils/             # Utilities and helpers
│   │   └── resources/                         # Resources (e.g., configuration files)
│   └── test/                                  # Application tests
├── target/                                    # Build folder generated by Maven
├── .gitattributes                             # Git attributes configuration
├── .gitignore                                 # Git ignore file
├── docker-compose.yaml                        # Docker Compose configuration
├── HELP.md                                    # Project help documentation
├── mvnw                                       # Maven Wrapper script for Linux
├── mvnw.cmd                                   # Maven Wrapper script for Windows
└── pom.xml                                    # Maven configuration file

특징

  • 이메일 및 비밀번호 확인을 통한 사용자 등록
  • JWT 인증으로 로그인
  • 이메일 링크 전달을 통한 비밀번호 복구
  • 임시 토큰 링크를 통한 비밀번호 재설정
  • 필드 유효성 검사 및 오류 처리

암호

구성 디렉터리

BCryptPasswordConfig.java

package dev.mspilari.login_app.configs;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
public class BCryptPasswordConfig {

    @Bean
    public BCryptPasswordEncoder bPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

코드 분석

  1. @구성

    • 이 주석은 Spring에 클래스에 Bean 정의가 포함되어 있음을 알려줍니다.
    • @Configuration으로 주석이 달린 클래스는 애플리케이션 시작 중에 처리되며 @Bean으로 주석이 달린 모든 메서드는 해당 반환 값을 관리 Bean으로 Spring 애플리케이션 컨텍스트에 추가합니다.
  2. @빈

    • bPasswordEncoder() 메소드의 @Bean 주석은 이 메소드가 Spring 애플리케이션 컨텍스트에서 Bean으로 등록되어야 하는 객체를 반환한다는 것을 나타냅니다.
    • 이렇게 하면 애플리케이션에서 필요할 때마다 BCryptPasswordEncoder 개체를 삽입할 수 있습니다.
  3. BCryptPasswordEncoder

    • 비밀번호 인코딩을 위해 Spring Security에서 제공하는 유틸리티 클래스입니다.
    • 암호를 해시하는 강력하고 안전한 방법으로 간주되는 BCrypt 해싱 알고리즘을 사용합니다. 알고리즘은 해싱하기 전에 자동으로 비밀번호에 "소금"을 추가하여 사전 공격 및 레인보우 테이블 공격에 저항합니다.
  4. 메소드 bPasswordEncoder()

    • Spring 프레임워크에서 이 메서드를 호출하면 BCryptPasswordEncoder의 새 인스턴스가 생성되어 애플리케이션 컨텍스트에서 사용할 수 있게 됩니다.
    • 그러면 애플리케이션의 다른 클래스가 이 빈을 자동 연결하여 비밀번호를 인코딩하거나 일치시킬 수 있습니다.

JwtConfig.java

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

코드 분석

1. 클래스 수준 주석

services:
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=database
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

  • 빈(Spring 관리 컴포넌트)이 정의된 Spring 구성 클래스임을 나타냅니다.
  • 여기에 정의된 Bean은 종속성 주입을 위해 Spring 애플리케이션 컨텍스트에서 사용할 수 있습니다.

2. 구성에서 RSA 키 삽입

docker compose up -d
  • @Value는 애플리케이션의 속성 파일(예: application.yml 또는 application.properties)에서 공개 키개인 키를 삽입하는 데 사용됩니다.
  • 이러한 키는 다음과 같이 속성에 있을 것으로 예상됩니다.
spring.application.name=login_app

spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=admin
spring.datasource.password=admin

spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525


spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8


spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

spring.config.import=classpath:env.properties

jwt.public.key=classpath:public.key
jwt.private.key=classpath:private.key


3. JWT 인코더 빈

spring.mail.username=<Get in your mailtrap account>
spring.mail.password=<Get in your mailtrap account>
  • 목적: JWT 토큰 인코딩(생성)을 위한 Bean을 생성합니다.
  • 단계:
    1. RSA 키 구축:
      • RSAKey.Builder는 공개/개인 RSA 키 쌍의 JWK(JSON 웹 키) 표현을 생성합니다.
    2. JWK 세트 만들기:
      • ImmutableJWKSet은 키를 세트에 저장합니다. 이 세트는 토큰 서명을 위해 Nimbus JOSE 라이브러리에서 사용됩니다.
    3. NimbusJwtEncoder:
      • 이 인코더는 ImmutableJWKSet을 사용하여 개인 키를 사용하여 토큰을 인코딩하고 서명합니다.

4. JWT 디코더 빈

login_app/
├── .mvn/                       # Maven folder (Maven configurations)
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── dev/
│   │   │       └── mspilari/
│   │   │           └── login_app/
│   │   │               ├── configs/           # Security, authentication, and other configurations
│   │   │               ├── domains/           # Main application domains
│   │   │               │   ├── email/         # Email-related logic
│   │   │               │   └── user/          # User-related logic
│   │   │               ├── exceptions/        # Custom exceptions and error handling
│   │   │               └── utils/             # Utilities and helpers
│   │   └── resources/                         # Resources (e.g., configuration files)
│   └── test/                                  # Application tests
├── target/                                    # Build folder generated by Maven
├── .gitattributes                             # Git attributes configuration
├── .gitignore                                 # Git ignore file
├── docker-compose.yaml                        # Docker Compose configuration
├── HELP.md                                    # Project help documentation
├── mvnw                                       # Maven Wrapper script for Linux
├── mvnw.cmd                                   # Maven Wrapper script for Windows
└── pom.xml                                    # Maven configuration file
  • 목적: JWT 토큰을 디코딩하고 검증하기 위한 Bean을 생성합니다.
  • 단계:
    1. 공개 키 확인:
      • NimbusJwtDecoder.withPublicKey()는 RSA 공개 키로 구성됩니다. 토큰의 서명을 검증합니다.
    2. 디코더 빌드:
      • build() 메소드는 디코더 인스턴스를 생성합니다.

JWT 인코딩 및 디코딩 작동 방식

  1. JWT 인코딩(토큰 생성):

    • JwtEncoder Bean은 서명된 JWT 토큰을 생성하는 데 사용됩니다. 이 토큰은 일반적으로 사용자 정보(예: 사용자 이름, 역할 등)를 클레임으로 포함하며 RSA 개인 키를 사용하여 서명됩니다.
    • 예:
    package dev.mspilari.login_app.configs;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    
    @Configuration
    public class BCryptPasswordConfig {
    
        @Bean
        public BCryptPasswordEncoder bPasswordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }
    
    
  2. JWT 디코딩(토큰 검증):

    • JwtDecoder Bean은 RSA 공개 키를 사용하여 토큰을 디코딩하고 확인하는 데 사용됩니다. 이렇게 하면 토큰이 다음과 같이 보장됩니다.
      • 서버에서 발급받았습니다(서명인증).
      • 무단으로 조작되지 않았습니다.
    • 예:
    package dev.mspilari.login_app.configs;
    
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.oauth2.jwt.JwtDecoder;
    import org.springframework.security.oauth2.jwt.JwtEncoder;
    import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
    import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;
    
    import com.nimbusds.jose.jwk.JWKSet;
    import com.nimbusds.jose.jwk.RSAKey;
    import com.nimbusds.jose.jwk.source.ImmutableJWKSet;
    
    @Configuration
    public class JwtConfig {
        @Value("${jwt.public.key}")
        private RSAPublicKey publicKey;
    
        @Value("${jwt.private.key}")
        private RSAPrivateKey privateKey;
    
        @Bean
        public JwtEncoder jwtEncoder() {
            var jwk = new RSAKey.Builder(this.publicKey).privateKey(this.privateKey).build();
    
            var jwks = new ImmutableJWKSet<>(new JWKSet(jwk));
    
            return new NimbusJwtEncoder(jwks);
        }
    
        @Bean
        public JwtDecoder jwtDecoder() {
            return NimbusJwtDecoder.withPublicKey(this.publicKey).build();
        }
    }
    

SecurityConfig.java

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

1. 클래스 수준 주석

services:
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=database
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

  • @Configuration: 이 클래스를 Bean을 정의하는 Spring 구성으로 표시합니다.
  • @EnableWebSecurity: Spring Security의 웹 보안 기능을 활성화합니다.
  • @EnableMethodSecurity: @PreAuthorize 또는 @Secured와 같은 메서드 수준 보안 주석을 활성화합니다. 이를 통해 역할, 권한 또는 조건에 따라 애플리케이션의 특정 메소드에 대한 액세스를 제어할 수 있습니다.

2. SecurityFilterChain 빈

docker compose up -d
  • 애플리케이션에 대한 보안 필터 체인을 정의합니다. 필터 체인은 들어오는 HTTP 요청에 적용되는 일련의 보안 필터입니다.

3. CSRF 보호

spring.application.name=login_app

spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=admin
spring.datasource.password=admin

spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525


spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8


spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

spring.config.import=classpath:env.properties

jwt.public.key=classpath:public.key
jwt.private.key=classpath:private.key

  • CSRF(Cross-Site Request Forgery) 보호가 비활성화되었습니다.
    • JWT와 같은 토큰이 이미 무단 요청을 방지하는 방법을 제공하므로 상태 비저장 API에는 CSRF 보호가 불필요한 경우가 많습니다.
    • 이를 비활성화하면 이 JWT 기반 API에 대한 보안 구성이 단순화됩니다.

4. 권한 부여 규칙

spring.mail.username=<Get in your mailtrap account>
spring.mail.password=<Get in your mailtrap account>
  • 인증이 필요한 엔드포인트를 구성합니다.
    • 모두 허용:
    • /user/register, /user/login, /user/redeem-password 및 /user/reset-password와 같은 엔드포인트에 대한 POST 요청은 모든 사람에게 공개됩니다(인증 필요 없음).
    • 이러한 엔드포인트는 일반적으로 로그인 없이 액세스할 수 있는 사용자 등록, 로그인, 비밀번호 복구/재설정에 사용될 가능성이 높습니다.
    • 기타 요청 인증:
    • 다른 모든 엔드포인트(anyRequest)에는 인증이 필요합니다.

5. JWT 검증

login_app/
├── .mvn/                       # Maven folder (Maven configurations)
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── dev/
│   │   │       └── mspilari/
│   │   │           └── login_app/
│   │   │               ├── configs/           # Security, authentication, and other configurations
│   │   │               ├── domains/           # Main application domains
│   │   │               │   ├── email/         # Email-related logic
│   │   │               │   └── user/          # User-related logic
│   │   │               ├── exceptions/        # Custom exceptions and error handling
│   │   │               └── utils/             # Utilities and helpers
│   │   └── resources/                         # Resources (e.g., configuration files)
│   └── test/                                  # Application tests
├── target/                                    # Build folder generated by Maven
├── .gitattributes                             # Git attributes configuration
├── .gitignore                                 # Git ignore file
├── docker-compose.yaml                        # Docker Compose configuration
├── HELP.md                                    # Project help documentation
├── mvnw                                       # Maven Wrapper script for Linux
├── mvnw.cmd                                   # Maven Wrapper script for Windows
└── pom.xml                                    # Maven configuration file
  • JWT 토큰을 사용하여 요청을 검증하는 OAuth 2.0 리소스 서버로 애플리케이션을 구성합니다.
  • JWT 디코더:
    • JwtDecoder Bean(JwtConfig에서 제공)은 보안 엔드포인트에 대한 요청에 대해 수신 JWT 토큰을 확인하는 데 사용됩니다.

작동 방식

  1. CSRF 비활성화: 이는 상태 비저장 JWT 인증에 의존하는 API이므로 CSRF를 비활성화하는 것이 일반적인 관행입니다.
  2. 승인 규칙:
    • 인증되지 않은 사용자는 명시적으로 허용된 엔드포인트(예: /user/register 또는 /user/login)에만 액세스할 수 있습니다.
    • 다른 요청에는 유효한 JWT 토큰이 필요합니다.
  3. JWT 검증:
    • Spring Security는 들어오는 요청에서 Authorization 헤더를 자동으로 추출합니다.
    • 헤더에 유효한 JWT 토큰이 포함되어 있으면 요청이 인증되고 사용자 컨텍스트가 설정됩니다.
    • 토큰이 유효하지 않거나 누락된 경우 요청이 거부됩니다.

도메인 디렉터리

이메일 디렉토리

서비스 디렉토리
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


사용자 디렉토리

컨트롤러 디렉토리
services:
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=database
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:


DTO 디렉토리

UserDto.java

docker compose up -d

UserRedeemPasswordDto.java

spring.application.name=login_app

spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=admin
spring.datasource.password=admin

spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525


spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8


spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

spring.config.import=classpath:env.properties

jwt.public.key=classpath:public.key
jwt.private.key=classpath:private.key


UserResetPasswordDto.java

spring.mail.username=<Get in your mailtrap account>
spring.mail.password=<Get in your mailtrap account>

엔터티 디렉토리

UserEntity.java

login_app/
├── .mvn/                       # Maven folder (Maven configurations)
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── dev/
│   │   │       └── mspilari/
│   │   │           └── login_app/
│   │   │               ├── configs/           # Security, authentication, and other configurations
│   │   │               ├── domains/           # Main application domains
│   │   │               │   ├── email/         # Email-related logic
│   │   │               │   └── user/          # User-related logic
│   │   │               ├── exceptions/        # Custom exceptions and error handling
│   │   │               └── utils/             # Utilities and helpers
│   │   └── resources/                         # Resources (e.g., configuration files)
│   └── test/                                  # Application tests
├── target/                                    # Build folder generated by Maven
├── .gitattributes                             # Git attributes configuration
├── .gitignore                                 # Git ignore file
├── docker-compose.yaml                        # Docker Compose configuration
├── HELP.md                                    # Project help documentation
├── mvnw                                       # Maven Wrapper script for Linux
├── mvnw.cmd                                   # Maven Wrapper script for Windows
└── pom.xml                                    # Maven configuration file

열거형 디렉토리

Role.java

package dev.mspilari.login_app.configs;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
public class BCryptPasswordConfig {

    @Bean
    public BCryptPasswordEncoder bPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
}


저장소 디렉토리

UserRepository.java

package dev.mspilari.login_app.configs;

import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.JwtEncoder;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;

import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.jwk.RSAKey;
import com.nimbusds.jose.jwk.source.ImmutableJWKSet;

@Configuration
public class JwtConfig {
    @Value("${jwt.public.key}")
    private RSAPublicKey publicKey;

    @Value("${jwt.private.key}")
    private RSAPrivateKey privateKey;

    @Bean
    public JwtEncoder jwtEncoder() {
        var jwk = new RSAKey.Builder(this.publicKey).privateKey(this.privateKey).build();

        var jwks = new ImmutableJWKSet<>(new JWKSet(jwk));

        return new NimbusJwtEncoder(jwks);
    }

    @Bean
    public JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withPublicKey(this.publicKey).build();
    }
}

서비스 디렉토리

UserService.java

@Configuration

예외 디렉토리

GlobalException.java

@Value("${jwt.public.key}")
private RSAPublicKey publicKey;

@Value("${jwt.private.key}")
private RSAPrivateKey privateKey;

유틸리티 디렉토리

JwtActions.java

  jwt.public.key=<your-public-key>
  jwt.private.key=<your-private-key>

결론

이 프로젝트에서는 Spring Boot를 사용하여 안전하고 기능이 풍부한 사용자 인증 시스템을 성공적으로 구현했습니다. 사용자 등록, 로그인, JWT 기반 인증과 같은 핵심 기능 외에도 애플리케이션에는 비밀번호 복구 시스템도 통합되어 있습니다. 사용자는 이메일 링크를 통해 비밀번호를 재설정할 수 있으므로 원활하고 안전한 복구 프로세스가 보장됩니다.

이메일 기반 비밀번호 복구를 용이하게 하기 위해 Spring Email을 안전하고 효율적인 이메일 테스트 서비스인 Mailtrap과 통합했습니다. 이를 통해 애플리케이션은 이메일이 안전하게 전송되고 통제된 환경에서 테스트되는지 확인하면서 임시 토큰과 함께 비밀번호 재설정 링크를 보낼 수 있습니다. 이 설정은 개발 및 테스트 중에 실제 사용자를 잠재적인 문제에 노출시키지 않고 비밀번호 복구와 같은 민감한 워크플로를 처리하는 방법을 보여줍니다.

보안 인증 방식, 강력한 비밀번호 관리, 원활한 이메일 통합이 결합된 이 애플리케이션은 모든 최신 웹 시스템을 위한 안정적인 기반이 됩니다. 개발자는 특정 요구 사항에 맞게 이러한 방식을 조정하여 확장성과 사용자 신뢰를 모두 보장할 수 있습니다. Spring Security 및 Mailtrap과 같은 모범 사례와 도구를 활용하여 안전하고 사용자 중심적인 애플리케이션을 쉽게 구축하는 방법을 보여주었습니다.


? 참조

  • 스프링 시큐리티
  • 메일트랩
  • 봄 이메일

? 프로젝트 저장소

  • Github의 프로젝트 저장소

? 나에게 말을 걸어

  • 링크드인
  • 깃허브
  • 포트폴리오

위 내용은 JWT 토큰 및 이메일 재설정 비밀번호를 사용한 로그인 시스템의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.