Spring/[P] AI 기반 사용자 맞춤형 메뉴와 맛집 추천

[Springboot/SpringSecurity/JWT] 로그인 개발하기 (1) build.gradle, config

alsruds 2024. 8. 14. 23:48

📂 apiPayload

📂 config

  L SecurityConfig

📂 controller

  L UserController

📂 domain

  L 📂 common

  L 📂 enums

  L User

📂 dto

  L 📂 request

        L LoginDto

  L 📂 response

        L LoginResponseDto

📂 jwt

  L JwtFilter

  L JwtUtil

📂 repository

  L UserRepository

📂 service

  L UserService

  L UserServiceImpl

🐘 build.gradle

 

 

Spring Security, JWT 사용을 위한 준비

 

build.gradle : Spring Security + Jwt 의존성 추가

...

dependencies {
	...
	// Spring Security + JWT
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'io.jsonwebtoken:jjwt-api: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'
}

...

 

SecurityConfig : Spring Security Configuration

@Configuration  // 이 클래스가 Spring 설정 클래스를 나타낸다는 것을 명시합니다.
@RequiredArgsConstructor  // 모든 final 필드에 대한 생성자를 자동으로 생성해줍니다.
@EnableWebSecurity  // Spring Security의 웹 보안을 활성화합니다.
public class SecurityConfig {

    @Bean  // PasswordEncoder 빈을 생성합니다. 비밀번호를 인코딩/디코딩하는 데 사용됩니다.
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();  // 다양한 인코딩 방식에 대응할 수 있는 PasswordEncoder를 생성합니다.
    }
    
    @Bean  // SecurityFilterChain 빈을 생성합니다. HTTP 보안 설정을 구성합니다.
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests((auth) -> auth
                        .requestMatchers("/", "/error", "/health").permitAll()  // 이 경로들에 대해 모든 사용자에게 접근을 허용합니다.
                        .requestMatchers("/user/login", "/user/signup", "/user/new-pw").permitAll()  // 로그인, 회원가입, 비밀번호 재설정 경로에 대해 모든 사용자에게 접근을 허용합니다.
                        .anyRequest().authenticated());  // 위에 명시된 경로 외의 모든 요청에 대해 인증된 사용자만 접근을 허용합니다.
        http
                .sessionManagement((auth) -> auth
                        .maximumSessions(1)  // 한 사용자가 가질 수 있는 세션의 최대 수를 1로 설정합니다.
                        .maxSessionsPreventsLogin(true));  // 최대 세션 수를 초과한 경우 새로운 로그인을 막습니다.
        http
                .sessionManagement((auth) -> auth
                        .sessionFixation().changeSessionId());  // 세션 고정을 방지하기 위해 세션 ID를 변경합니다.
        http
                .csrf(AbstractHttpConfigurer::disable);  // CSRF 보호를 비활성화합니다.
        http
                .cors(AbstractHttpConfigurer::disable);  // CORS 보호를 비활성화합니다.
        http
                .httpBasic(AbstractHttpConfigurer::disable);  // HTTP Basic 인증을 비활성화합니다.
        http
                .addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class);  // UsernamePasswordAuthenticationFilter 앞에 커스텀 JWT 필터를 추가합니다.

        return http.build();  // 설정된 SecurityFilterChain 객체를 반환합니다.
    }
}

 

  L CSRF (Cross-Site Request Forgery) : 사용자가 신뢰하는 웹사이트에서 악의적인 요청을 수행하게 만드는 공격 기법

      L 비활성화 하는 이유1 : 대부분의 RESTful API 서버는 상태를 유지하지 않기 때문에 (stateless), CSRF 공격에 취약하지 않습니다. CSRF 공격은 주로 사용자가 브라우저에 로그인한 상태에서 발생하므로, 클라이언트와 서버 간의 상호작용이 쿠키 기반 세션에 의존하지 않는다면 CSRF를 비활성화할 수 있습니다.

      L 비활성화 하는 이유2 : 만약 애플리케이션이 JWT(JSON Web Token)를 이용한 인증을 사용한다면, CSRF 토큰을 추가로 사용할 필요가 없습니다. JWT는 보통 로컬 저장소에 저장되고, 서버는 요청 시 이 토큰을 검증하므로 CSRF에 대해 보호할 필요가 줄어듭니다.

 

  L CORS (Cross-Origin Resource Sharing) : 웹 브라우저에서 다른 출처(origin)의 리소스를 요청할 때 발생하는 보안 기능

      L 비활성화 하는 이유1 : 개발 단계에서 클라이언트가 다른 출처에서 API에 접근하는 경우, CORS를 일시적으로 비활성화하여 테스트할 수 있습니다. 그러나 이는 개발 환경에서만 권장되며, 실제 운영 환경에서는 CORS를 적절히 설정하는 것이 중요합니다.

      L 비활성화 하는 이유2 : 리버스 프록시 서버를 사용하는 경우, 실제로는 같은 출처에서 요청이 이루어지므로 CORS를 비활성화할 수 있습니다.

 

  L HTTP Basic 인증 : 간단하지만, 보안성이 낮고 사용자 경험을 저해할 수 있습니다.

      L 대안 : JWT, OAuth2, 세션 기반 인증

 


2024.08.09 - [Spring/[P] AI 기반 사용자 맞춤형 메뉴와 맛집 추천] - [Springboot] 로그인 설계하기

 

[Springboot] 로그인 설계하기

📂 /user  L 회원 가입  L 회원 탈퇴  L 로그인 ⬅️⬅️⬅️   L 로그아웃  L 비밀번호 재설정 (로그인 전)  L 비밀번호 재설정 (로그인 후)   🔧 디자인    🔧 필요한 데이터   L email   L pas

alsrudalsrudalsrud.tistory.com