개발지식 먹는 하마 님의 블로그
[Spring] Spring Security 본문
Spring 기반 애플리케이션의 인증(Authentication)과 권한 부여(Authorization)를 담당하는 강력한 보안 프레임워크이다
- principal - credential 패턴
principal (주체) - 인증을 받으려는 사용자나 시스템의 '식별자'
credential (자격 증명) - 사용자가 인증/인가를 위해 제공하는 것
- Filter 기반
- Bean으로 설정 가능
Spring Security 구조 및 기능
Authentication Manager는 인증을 담당하고 Authentication Provider가 실제 로직을 수행한다.
Security Context
인증된 사용자의 정보를 저장한다.
SecurityContextHolder를 통해 애플리케이션 어디서나 인증된 사용자 정보에 접근할 수 있다!
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
Object principal = auth.getPrincipal(); // UserDetails 객체
Security 컨벤션에 따라 User의 권한 Role은 "ROLE_권한" 형태여야 한다.
Session 관리
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // JWT 사용 시
// .maximumSessions(1) // 동시 세션 제한
// .sessionFixation().migrateSession() // 세션 고정 공격 방지
)
CSRF(Cross-Site Request Forgery) 보호
기본적으로 CSRF 보호 기능을 제공한다.
Thymrleaf 템플릿에서 th:action 속성을 사용할 때 자동으로 CSRF 토큰이 포함된다.
<form th:action="@{/login}" method="post">
<!-- CSRF 토큰이 자동으로 포함됨 -->
</form>
XSS(Cross-Site Scripting) 방어
XSS : 웹 애플리케이션에 악성 스크립트를 삽입하는 공격
Thymeleaf는 기본적으로 출력 내용을 이스케이프 처리하여 XSS 공격을 방지한다.
<!-- 자동으로 이스케이프 처리됨 -->
<p th:text="${userInput}"></p>
<!-- 이스케이프를 비활성화하려면 (신뢰할 수 있는 데이터만 사용) -->
<p th:utext="${trustedHtml}"></p>
메서드에 대해서 보안 설정
메서드 호출에 대한 보안 설정을 어노테이션으로 구현할 수 있다.
@PreAuthorize("hasRole('ADMIN')")
public List<User> getAllUsers() {
return userRepository.findAll();
}
@PostAuthorize("returnObject.username == authentication.name")
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
Spring Security 흐름
1) Http Request 수신
사용자가 로그인 정보와 함께 인증 요청을 한다.
2) AuthenticationToken 생성
AuthenticationFilter가 요청을 가로챈다.
가로챈 정보를 기반으로 UsernamePasswordAuthenticationToken가 토큰을 생성한다.
// 1. UsernamePasswordAuthenticationToken 생성 (인증되지 않은 상태)
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword());
3) Authentication Manager에게 인증 위임
Authentication Manager는 ProviderManager에게 UsernamePasswordToken을 전달한다.
Authentication authentication = authenticationManager.authenticate(authenticationToken);
AuthenticationManager 내부 동작
4) AuthenticationProvider 인증 시도 + 5) 6) 7)
- AuthenticationProvider는 UserDetailsService를 호출한다.
- DB에서 사용자를 조회하고, 조회된 정보로 User Details 객체를 만든다.
- AuthenticationProvider는 입력 받은 사용자 정보와 User Details 객체의 정보를 비교한다.
8) 인증 완료 처리
인증 완료 시, 권한과 사용자 정보를 담은 Authentication 객체를 반환한다.
인증 실패 시, Authentication Exception 예외가 발생한다.
9) Authentication 객체 반환
Athentication Filter에 Authentication을 반환한다.
10) Security Context에 인증 객체 설정
Authentication 객체를 세션 기반의 Security Context에 저장한다.
Security Config 설정
@EnableWebSecurity 선언이 필요하다!
SecurityFiltercChain에서 Security을 세부사항을 설정한다.
- CSRF 보호
- 인증/인가 (api 별 설정)
- 폼 로그인
- HTTP Basic
- H2 콘솔
- 세션 관리
- 예외 처리 설정
- jwtFilter 설정
'Web' 카테고리의 다른 글
[Spring] QueryDSL 기초 + 페이징 적용 (0) | 2025.05.07 |
---|---|
공통 로직 처리를 위한 Filter, Interceptor 그리고 AOP (0) | 2025.04.21 |
로딩 전략과 Fetch Join 그리고 Proxy (0) | 2025.04.17 |
쿠키 Cookie와 세션 Session 그리고 토큰 Token (1) | 2025.04.10 |
DTO (Data Transfer Object) (0) | 2025.03.31 |