소개
Spring 로그인 애플리케이션은 Spring Boot를 사용하여 구축된 안전하고 강력한 사용자 관리 시스템입니다. 이 프로젝트는 인증, 권한 부여 및 사용자 계정 기능을 구현하는 현대적인 접근 방식을 보여줍니다. 주요 기능에는 사용자 등록, BCrypt를 통한 안전한 비밀번호 처리, 이메일 기반 비밀번호 재설정, JWT(JSON 웹 토큰) 인증이 포함됩니다. 확장성과 확장성을 염두에 두고 설계된 이 애플리케이션은 사용자 관리 및 역할 기반 액세스 제어가 필요한 프로젝트를 위한 탁월한 기반 역할을 합니다.
Spring Security, Spring Data JPA 및 JavaMailSender와 같은 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> </get></get>
비대칭 키를 만드는 방법은 무엇입니까?
이 게시물에서 비대칭 키를 생성하는 방법을 확인하세요
프로젝트 구조
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(); } }
코드 분석
-
@구성
- 이 주석은 Spring에 클래스에 Bean 정의가 포함되어 있음을 알려줍니다.
- @Configuration으로 주석이 달린 클래스는 애플리케이션 시작 중에 처리되며 @Bean으로 주석이 달린 모든 메서드는 해당 반환 값을 관리 Bean으로 Spring 애플리케이션 컨텍스트에 추가합니다.
-
@빈
- bPasswordEncoder() 메소드의 @Bean 주석은 이 메소드가 Spring 애플리케이션 컨텍스트에서 Bean으로 등록되어야 하는 객체를 반환한다는 것을 나타냅니다.
- 이렇게 하면 애플리케이션에서 필요할 때마다 BCryptPasswordEncoder 개체를 삽입할 수 있습니다.
-
BCryptPasswordEncoder
- 비밀번호 인코딩을 위해 Spring Security에서 제공하는 유틸리티 클래스입니다.
- 암호를 해시하는 강력하고 안전한 방법으로 간주되는 BCrypt 해싱 알고리즘을 사용합니다. 알고리즘은 해싱하기 전에 자동으로 비밀번호에 "소금"을 추가하여 사전 공격 및 레인보우 테이블 공격에 저항합니다.
-
메소드 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> </get></get>
- 목적: JWT 토큰 인코딩(생성)을 위한 Bean을 생성합니다.
-
단계:
-
RSA 키 구축:
- RSAKey.Builder는 공개/개인 RSA 키 쌍의 JWK(JSON 웹 키) 표현을 생성합니다.
-
JWK 세트 만들기:
- ImmutableJWKSet은 키를 세트에 저장합니다. 이 세트는 토큰 서명을 위해 Nimbus JOSE 라이브러리에서 사용됩니다.
-
NimbusJwtEncoder:
- 이 인코더는 ImmutableJWKSet을 사용하여 개인 키를 사용하여 토큰을 인코딩하고 서명합니다.
-
RSA 키 구축:
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을 생성합니다.
-
단계:
-
공개 키 확인:
- NimbusJwtDecoder.withPublicKey()는 RSA 공개 키로 구성됩니다. 토큰의 서명을 검증합니다.
-
디코더 빌드:
- build() 메소드는 디코더 인스턴스를 생성합니다.
-
공개 키 확인:
JWT 인코딩 및 디코딩 작동 방식
-
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(); } }
-
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(); } }
- JwtDecoder Bean은 RSA 공개 키를 사용하여 토큰을 디코딩하고 확인하는 데 사용됩니다. 이렇게 하면 토큰이 다음과 같이 보장됩니다.
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> </get></get>
- 인증이 필요한 엔드포인트를 구성합니다.
- 모두 허용:
- /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 토큰을 확인하는 데 사용됩니다.
작동 방식
- CSRF 비활성화: 이는 상태 비저장 JWT 인증에 의존하는 API이므로 CSRF를 비활성화하는 것이 일반적인 관행입니다.
-
승인 규칙:
- 인증되지 않은 사용자는 명시적으로 허용된 엔드포인트(예: /user/register 또는 /user/login)에만 액세스할 수 있습니다.
- 다른 요청에는 유효한 JWT 토큰이 필요합니다.
-
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> </get></get>
엔터티 디렉토리
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> </your-private-key></your-public-key>
결론
이 프로젝트에서는 Spring Boot를 사용하여 안전하고 기능이 풍부한 사용자 인증 시스템을 성공적으로 구현했습니다. 사용자 등록, 로그인, JWT 기반 인증과 같은 핵심 기능 외에도 애플리케이션에는 비밀번호 복구 시스템도 통합되어 있습니다. 사용자는 이메일 링크를 통해 비밀번호를 재설정할 수 있으므로 원활하고 안전한 복구 프로세스가 보장됩니다.
이메일 기반 비밀번호 복구를 용이하게 하기 위해 Spring Email을 안전하고 효율적인 이메일 테스트 서비스인 Mailtrap과 통합했습니다. 이를 통해 애플리케이션은 이메일이 안전하게 전송되고 통제된 환경에서 테스트되는지 확인하면서 임시 토큰과 함께 비밀번호 재설정 링크를 보낼 수 있습니다. 이 설정은 개발 및 테스트 중에 실제 사용자를 잠재적인 문제에 노출시키지 않고 비밀번호 복구와 같은 민감한 워크플로를 처리하는 방법을 보여줍니다.
보안 인증 방식, 강력한 비밀번호 관리, 원활한 이메일 통합이 결합된 이 애플리케이션은 모든 최신 웹 시스템을 위한 안정적인 기반이 됩니다. 개발자는 특정 요구 사항에 맞게 이러한 방식을 조정하여 확장성과 사용자 신뢰를 모두 보장할 수 있습니다. Spring Security 및 Mailtrap과 같은 모범 사례와 도구를 활용하여 안전하고 사용자 중심적인 애플리케이션을 쉽게 구축하는 방법을 보여주었습니다.
? 참조
- 스프링 시큐리티
- 메일트랩
- 봄 이메일
? 프로젝트 저장소
- Github의 프로젝트 저장소
? 나에게 말을 걸어
- 링크드인
- 깃허브
- 포트폴리오
위 내용은 JWT 토큰 및 이메일 재설정 비밀번호를 사용한 로그인 시스템의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

JVM은 바이트 코드 해석, 플랫폼 독립 API 및 동적 클래스 로딩을 통해 Java의 Wora 기능을 구현합니다. 1. 바이트 코드는 크로스 플랫폼 작동을 보장하기 위해 기계 코드로 해석됩니다. 2. 표준 API 추상 운영 체제 차이; 3. 클래스는 런타임에 동적으로로드되어 일관성을 보장합니다.

JAVA의 최신 버전은 JVM 최적화, 표준 라이브러리 개선 및 타사 라이브러리 지원을 통해 플랫폼 별 문제를 효과적으로 해결합니다. 1) Java11의 ZGC와 같은 JVM 최적화는 가비지 수집 성능을 향상시킵니다. 2) Java9의 모듈 시스템과 같은 표준 라이브러리 개선은 플랫폼 관련 문제를 줄입니다. 3) 타사 라이브러리는 OpenCV와 같은 플랫폼 최적화 버전을 제공합니다.

JVM의 바이트 코드 검증 프로세스에는 네 가지 주요 단계가 포함됩니다. 1) 클래스 파일 형식이 사양을 준수하는지 확인, 2) 바이트 코드 지침의 유효성과 정확성을 확인하고 3) 유형 안전을 보장하기 위해 데이터 흐름 분석을 수행하고 4) 검증의 철저한 성능 균형을 유지합니다. 이러한 단계를 통해 JVM은 안전하고 올바른 바이트 코드 만 실행되도록하여 프로그램의 무결성과 보안을 보호합니다.

Java'splatforminccendenceallowsapplicationStorunonAnyAnyOperatingSystemwithajvm.1) SingleCodeBase : writeAndCompileOnceforAllPlatforms.2) EasyUpdates : UpdateByTeCodeForsimultiancodeporsimultiancomeDeployment.3) 시험 효율성 : westernoneplatformforunivor.4) Scalab

Java의 플랫폼 Independence는 JVM, JIT 컴파일, 표준화, 제네릭, Lambda 표현 및 ProjectPanama와 같은 기술을 통해 지속적으로 향상됩니다. 1990 년대 이래 Java는 기본 JVM에서 고성능 현대 JVM으로 발전하여 다양한 플랫폼에서 코드의 일관성과 효율성을 보장했습니다.

Java는 플랫폼 별 문제를 어떻게 완화합니까? Java는 JVM 및 표준 라이브러리를 통해 플랫폼 독립성을 구현합니다. 1) Bytecode 및 JVM을 사용하여 운영 체제 차이를 추상화합니다. 2) 표준 라이브러리는 Paths 클래스 처리 파일 경로 및 Charset 클래스 처리 문자 인코딩과 같은 크로스 플랫폼 API를 제공합니다. 3) 최적화 및 디버깅을 위해 실제 프로젝트에서 구성 파일 및 다중 플랫폼 테스트를 사용하십시오.

java'splatformincendenceenhancesmicroservicesarchitectureDeploymentFlexibility, 일관성, 확장 성 및 포트 가능성

Graalvm은 Java의 플랫폼 독립성을 세 가지 방식으로 향상시킵니다. 1. 교차 언어 상호 운용성, Java는 다른 언어와 원활하게 상호 작용할 수 있습니다. 2. 독립적 인 런타임 환경, Java 프로그램을 GraalvMnativeImage를 통해 로컬 실행 파일로 컴파일합니다. 3. 성능 최적화, Graal Compiler는 Java 프로그램의 성능과 일관성을 향상시키기 위해 효율적인 기계 코드를 생성합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
