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
반응형
'포트폴리오' 카테고리의 다른 글
포트폴리오 리뷰: AI 갤러리 프로젝트 - Node.js, MongoDB, EJS 템플릿 엔진을 활용한 웹 개발 (0) | 2023.07.20 |
---|---|
친환경 쇼핑몰 프로젝트 구축하기: 백엔드 상품 관리 기능 구현 - 엔티티, 리파지토리, 서비스와 이미지 저장 방식 적용 (4) (0) | 2023.06.26 |
친환경 쇼핑몰 프로젝트 구축하기: 리액트와 리코일을 이용한 로그인 및 회원가입 페이지 구현 - 전역 상태 관리와 라우팅 적용 (3) (0) | 2023.06.26 |
친환경 쇼핑몰 프로젝트 구축하기: 1인 개발자의 웹사이트 제작 및 기술 스택 소개 (1) (0) | 2023.06.26 |
웹 포트폴리오 마스터하기: 김현승 포트폴리오 개선 방향과 코드 리뷰의 모든 것 (0) | 2023.03.10 |
댓글