본문 바로가기
포트폴리오

친환경 쇼핑몰 프로젝트 구축하기: 스프링 부트와 JWT를 활용한 회원가입 및 로그인 기능 구현 - 보안 설정 및 인증 과정 개요 (2)

by 플라퉁 2023. 6. 26.
728x90
반응형

 

 

 

 

백엔드 회원가입 및 로그인 기능을 구현해보겠습니다.

 

자바 17, 스프링부트, 그래들, 코틀린, postgres, 스프링 security를 사용합니다.

 

 

 

가장 먼저 저는 사용자보안으로 jwt 를 사용할겁니다.

 

import com.hsproject.envmarket.oauth.RoleName
import com.hsproject.envmarket.util.JwtAuthenticationEntryPoint
import com.hsproject.envmarket.util.JwtAuthorizationFilter
import lombok.RequiredArgsConstructor
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.authentication.AuthenticationManager
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
import org.springframework.security.crypto.password.PasswordEncoder
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter

import org.springframework.web.cors.CorsConfiguration
import org.springframework.web.cors.UrlBasedCorsConfigurationSource
import org.springframework.web.filter.CorsFilter
import org.springframework.security.core.userdetails.UserDetailsService


@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
class SecurityConfig(private val userDetailsService: UserDetailsService) : WebSecurityConfigurerAdapter() {


    @Autowired
    private lateinit var jwtConfig: JwtConfiguration

    @Autowired
    private lateinit var jwtAuthenticationEntryPoint: JwtAuthenticationEntryPoint

    @Bean
    override fun authenticationManagerBean(): AuthenticationManager {
        return super.authenticationManagerBean()
    }
    @Bean
    fun corsFilter(): CorsFilter {
        val source = UrlBasedCorsConfigurationSource()
        val config = CorsConfiguration()
        config.allowCredentials = false
        config.addAllowedOrigin("*")
        config.addAllowedHeader("*")
        config.addAllowedMethod("*")
        source.registerCorsConfiguration("/**", config)
        return CorsFilter(source)
    }

    @Bean
    fun jwtAuthorizationFilter(): JwtAuthorizationFilter {
        return JwtAuthorizationFilter(authenticationManager(), jwtConfig, userDetailsService)
    }

    @Bean
    fun passwordEncoder(): PasswordEncoder {
        return BCryptPasswordEncoder()
    }

    fun configureGlobal(auth: AuthenticationManagerBuilder) {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder())
    }


    override fun configure(httpSecurity: HttpSecurity) {

        httpSecurity
                // 웹 애플리케이션에 대한 보안 설정
                .addFilter(corsFilter())
                .addFilterBefore(jwtAuthorizationFilter(), UsernamePasswordAuthenticationFilter::class.java)
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/admin/**").hasRole(RoleName.ADMIN.name) // 관리자 권한이 있는 도메인만 접근을 허용합니다.
                .antMatchers("/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint)
        // JWT 및 세션 사용 제거
    }
}

 

우선 세부적인 코드량이 많아 핵심 기능만 설명하겠습니다.

 

먼저 해당 securityConfig에는 

 

 

1. 

UserDetailsService

 

가 필요합니다.

 

해당 서비스에는 유저의 로그인 정보 및 유저권한을 확인하는 로직이 들어가야합니다.

 

 

 

 

2.

JwtConfiguration

 

이 필요합니다. 해당 config에는 인증에 사용할 시크릿키가 있어야합니다. 해당 키를 이용하여

 

HS512

 

알고리즘을 사용 토큰을 생성합니다.

 

 

 

 

 

3.

JwtAuthenticationEntryPoint

 

가 있어야합니다. 인증에 실패할 경우의 endpoint를 지정해줍니다.

 

 

 

 

 

4.

JwtAuthorizationFilter

 

가 있습니다. 해당 filter는 토큰을 검증하는 로직이 있어야 합니다.

 

 

 

 

 

5.

마지막

configure

 

로직을 보면 웹 애플리케이션에 대한 보안 설정을 확인 할 수 있습니다.

 

cors필터, 패스워드 인코더, jwt 토큰 검증, 관리자 권한 확인

 

 

그리고 마지막에는 세션을 사용하였다가 제거하였습니다.

 

jwt 토큰을 쓰는데 굳이 세션을 사용할 필요가 없었기 때문입니다.

 

 

 

다음에는 프론트 회원가입및 로그인 페이지를 구현해 보겠습니다.

 

 

 

 

728x90
반응형

댓글