ballqs 님의 블로그
[Spring] Spring Security 기초 사용법 본문
Spring Security란?
Spring 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해주며 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는데 도움을 주는 Spring의 강력한 프레임워크이다.
dependencies 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
@Configuration를 통한 사용 방법
@Configuration
@EnableWebSecurity // Spring Security 지원을 가능하게 함
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 설정(disable 처리했기에 사용하지 않는다는 것)
http.csrf((csrf) -> csrf.disable());
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정(static에는 접근 허용)
// .requestMatchers("/api/user/**").hasRole("ADMIN") // 해당 URL은 ADMIN 권한을 가진 사람만 접근 가능
.anyRequest().authenticated() // 그 외 모든 요청 인증처리
);
// 로그인 사용
http.formLogin(Customizer.withDefaults());
return http.build();
}
}
CSRF(사이트 간 요청 위조,Cross-site request forgery)란?
- 공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용하여 웹 서버에 사용자가 의도하지 않은 요청을 전달하는 것
- CSRF 설정이 되어 있는 경우 html에서 CSRF 토큰 값을 넘겨주어야 요청을 수신 가능
- 쿠키 기반의 취약점을 이용한 공격이기에 REST방식의 API는 disable(비활성)이 가능함
Spring Security의 default 로그인 기능
Spring Security에서 기본적으로 제공하는 로그인이 있다.
이를 인증해야지 어떤 url이던 접근이 가능해진다. 다만 @Configuration에서 예외처리한 url은 접근 가능하다.
기본 값
username : user
Password : Spring log 확인(서버 시작시마다 변경됨)
Spring Security 동작 흐름
Spring에서 모든 호출은 DispatcherServlet을 통과하게 되고 이후에 각 요청을 담당하는 Controller로 분배된다.
이 때 각 요청에 대해서 DispatcherServlet 이전에 단계가 필요하고 이때 사용되는 것이 Filter이다.
UsernamePasswordAuthenticationFilter
UsernamePasswordAuthenticationFilter는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 Filter이다.
인증 과정
- 사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 인증된 사용자의 정보가 담기는 인증 객체인 Authentication의 종류 중 하나인 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증을 시도
- 실패하면 SecurityContextHolder를 비운다
- 성공하면 SecurityContextHolder에 Authentication를 세팅한다.
SecurityContextHolder
더보기
// 예시코드
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication = new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
context.setAuthentication(authentication); // SecurityContext 에 인증 객체 Authentication 를 저장합니다.
SecurityContextHolder.setContext(context);
Authentication
더보기
- 현재 인증된 사용자를 나타내며 SecurityContext에서 가져올 수 있다.
- principal : 사용자를 식별한다.
- Username/Password 방식으로 인증할 때 일반적으로 UserDetails 인스턴스
- credentials : 주로 비밀번호, 대부분 사용자 인증에 사용한 후 비운다.
- authorities : 사용자에게 부여한 권한을 GrantedAuthority로 추상화하여 사용한다.
<UserDetails>
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
UserRoleEnum role = user.getRole();
String authority = role.getAuthority();
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(simpleGrantedAuthority);
return authorities;
}
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
마무리
오늘 정리한 글은 Spring Security의 아주 기초적인 부분을 정리한 것이고 좀더 공부하게 되면 더 작성해야겠다.
'코딩 공부 > Spring' 카테고리의 다른 글
[Spring] CustomException , ErrorCode 작성 및 적용 (0) | 2024.09.05 |
---|---|
[Spring] @Query를 사용하다 생긴 문제 , Enum 활용 , Java 설정 파일 (0) | 2024.09.04 |
[Spring] AOP (0) | 2024.08.29 |
[Spring] Test 코드 작성(stub , mock) (0) | 2024.08.28 |
[Spring] JPA Save() vs SaveAll() vs Bulk Insert (0) | 2024.08.26 |