일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 너비 우선 탐색
- 그래프 이론
- 문자열
- 알고리즘
- SWEA
- 스택
- Vue
- 백준
- dfs
- Spring Security
- 프로그래머스
- 자료 구조
- MYSQL
- 프로젝트
- JPA
- 소수 판정
- n과 m
- 다이나믹 프로그래밍
- 수학
- 백트래킹
- springboot
- 브루트포스 알고리즘
- 배포
- 그래프 탐색
- 깊이 우선 탐색
- 재귀
- 정보처리기사
- 정수론
- 구현
- DB
- Today
- Total
영원히 남는 기록, 재밌게 쓰자
Spring Security 개념과 스프링 부트에 적용 해보기 본문
Spring Security란?
스프링 프레임워크 기반의 애플리케이션에서 보안과 인증을 처리하기 위한 모듈이다.
spring security는 애플리케이션의 보안을 간단하고 유연하게 구현할 수 있도록 기능들을 제공한다.
- 인증(Authentication):
사용자가 신원을 증명하고 로그인하는 과정. Spring Security는 사용자의 로그인 정보를 기반으로 인증을 처리한다. - 인가(Authorization):
인증된 사용자가 특정 리소스 또는 기능에 접근할 권한이 있는지 결정하는 과정. Spring Security는 사용자의 권한을 관리하고 보호된 리소스에 대한 접근을 허용하거나 거부하는 기능을 제공한다. - 보안 필터 체인(Security Filter Chain):
Spring Security는 여러 개의 보안 필터로 구성된 필터 체인을 제공한다. 각 필터는 특정한 보안 작업을 처리하며, 이 필터 체인은 요청의 인증 및 인가 과정을 처리하고 보안 관련 기능을 구현한다. - 세션 관리(Session Management):
Spring Security는 세션 관리를 통해 사용자의 인증 상태를 유지하고 관리한다. 세션 공격을 방지하거나 세션 유지 정책을 구성할 수 있다. - CSRF(Cross-Site Request Forgery) 보호:
Spring Security는 CSRF 공격을 방지하기 위한 기능을 기본적으로 제공한다. - 그 밖의 다양한 인증 및 인가 방식 지원:
Spring Security는 다양한 인증 및 인가 방식을 지원한다. 폼 인증, 기본 인증, OAuth, OpenID Connect, JWT 등등..
Security 관련 컨테이너(Context)
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfig {
private static final String[] AUTH_WHITELIST = {"/api/user/**", "/api/teacher/**", "/api/student/**", "/api/class"};
private final CustomAccessDeniedHandler accessDeniedHandler;
private final CustomAuthenticationEntryPoint authenticationEntryPoint;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 보호 비활성화
http.csrf((csrf) -> csrf.disable());
http.cors(Customizer.withDefaults());
//세션 관리 상태 없음으로 구성, Spring Security가 세션 생성 or 사용 X
http.sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(
SessionCreationPolicy.STATELESS));
//FormLogin, BasicHttp 비활성화
http.formLogin((form) -> form.disable());
http.httpBasic(AbstractHttpConfigurer::disable);
// 권한 규칙 작성
http.authorizeHttpRequests(authorize -> authorize
.requestMatchers(AUTH_WHITELIST).permitAll()
//@PreAuthorization을 사용할 것이기 때문에 모든 경로에 대한 인증 처리는 Pass
.anyRequest().permitAll()
// .anyRequest().authenticated()
);
// 인증과 인가에 실패 했을 때 처리할 exception handler
http.exceptionHandling((exceptionHandling) -> exceptionHandling
.authenticationEntryPoint(authenticationEntryPoint)
.accessDeniedHandler(accessDeniedHandler)
);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Security 관련 설정을 하려고 하니까 Spring 2점대 버전에 비해 Deprecated된 설정 방식이 많았다. 2버전에서는 WebSecurityConfigurerAdapter를 상속받아 구현하는 형태로 많이 사용 했었는데, Spring 3버전에 들어서 해당 방식보다 SecurityFilterChain을 Bean으로 등록하는 방식을 권장하고, Adapter 방식은 Deprecated되었다.
@EnableWebSecurity: Spring Security 컨텍스트 설정임을 명시한다.
@EnableGlobalMethodSecurity: Annotation을 통해서 Controller의 모든 API들의 보안 수준을 설정할 수 있도록 활성화 한다.
SecurityFilterChain의 설정 내용들
1. CSRF 보호 비활성화 : CSRF 토큰을 사용하지 않을 것이므로 확인하지 않도록 설정
2. CORS 설정을 적용 : 다른 도메인의 웹 페이지에서 리소스에 접근할 수 있도록 허용
- Customizer.withDefaults(): cors() 관련 기본 설정을 사용한다는 의미
- 모든 출처(*)에 대한 액세스를 허용합니다.
- GET, POST, PUT, DELETE, OPTIONS 메서드를 허용합니다.
- 'authorization', 'content-type', 'x-auth-token' 헤더를 허용합니다.
3. 폼 로그인과 HTTP 기본 인증을 비활성화 :
- 기본적으로 Spring Security에서는 폼 기반의 로그인 기능을 제공한다.
- 이 기능을 비활성화하면 사용자가 기본적으로 제공하는 폼을 통해 로그인할 수 없게 됩니다.
- Spring 웹 페이지에서 제공되는 로그인 폼을 통해 사용자를 인증하는 메커니즘과 HTTP 기반 기본 인증을 비활성화한다.
4. 권한에 따른 접근 가능한 자원(행위)의 규칙 작성:
- 메서드 단위 보안 수준을 사용할 예정(@PreAuthorization을 사용하여 컨트롤러의 메서드 단위로 접근 제한을 하기 위해서)
- 그래서 기본적으로 anyRequest()에 대해 permitAll()을 해주었다.
- @EnableGlobalMethodSecurity의 securedEnabled = true를 사용하면 @PreAuthorization("hasRole('ADMIN') -> @Secured("ADMIN")으로 대체할 수 있다.
여기는 JWT 토큰 기반 인증과 인가에 대한 설정과 구현 코드가 없다.
적용 후 기존 회원 가입 테스트 결과는 잘 나오는 것을 확인할 수 있었다.
다음에는 JWT 토큰 방식을 적용해서 로그인 시 토큰을 사용해서 인증과 인가를 하는 것에 대해 공부해보아야겠다.
참고 및 스크랩
'springboot' 카테고리의 다른 글
여러가지 의존 관계 주입 방법(스프링 공부) (0) | 2025.04.10 |
---|---|
Spring Security 와 JWT를 활용한 API 인가 로직 구현 및 적용 해보기 (0) | 2024.06.20 |
Spring Security와 JWT 토큰 방식 이용한 로그인 인증 (0) | 2024.06.19 |
Password Encoder로 비밀번호 암호화 처리해보기 (0) | 2024.06.17 |
@SpringBootApplication 설정 애너테이션들 (@Import, scanBasePackages 속성, @Profile) (0) | 2024.02.08 |