스프링
스프링 시큐리티 - 간단한 인증절차 정리
개발자 포비
2024. 12. 16. 16:37
1. 스프링 시큐리티의 인증과 인가
1.1 인증 (Authentication)
사용자 요청 ---> 인증 필터 ---> 인증 성공/실패
|
| +------------------------+
| | 인증 프로세스 |
+---> | 1. 자격증명 확인 |
| 2. 사용자 존재 확인 |
| 3. 비밀번호 검증 |
+------------------------+
인증은 사용자가 본인이 맞는지를 확인하는 과정입니다. 일반적으로 다음 단계를 거칩니다:
- 사용자가 자격증명(credentials)을 제공
- 시스템이 해당 정보를 검증
- 인증 성공 시 보안 컨텍스트에 인증 정보 저장
1.2 인가 (Authorization)
인증된 요청 ----> 권한 검사 ----> 리소스 접근
|
| +-------------------------+
| | 권한 확인 프로세스 |
+---> | 1. 역할 확인 |
| 2. 권한 범위 확인 |
| 3. 리소스 접근 결정 |
+-------------------------+
인가는 인증된 사용자가 특정 리소스에 접근할 권한이 있는지 확인하는 과정입니다:
- 사용자의 역할(Role) 확인
- 요청된 리소스에 대한 접근 권한 확인
- 적절한 권한이 없는 경우 접근 거부
2. 주요 보안 위협과 대응
2.1 세션 고정 공격
[공격자] [희생자]
| |
|-- 세션ID 공유 --> |
| |
| [서버] |
| +------------+ |
+-->| 세션:ABC |<----+
+------------+
[대응 방안]
|
+-- 로그인 시 새로운 세션 생성
+-- 세션 타임아웃 설정
+-- 세션 무효화 정책
2.2 XSS (Cross-Site Scripting)
[악의적인 스크립트 주입]
|
v
+----------------+ +---------------+
| 취약한 웹 페이지 | --> | 사용자 브라우저 |
+----------------+ +---------------+
| |
| [스크립트 실행] |
+--------------------+
[대응 방안]
1. 입력 값 검증
2. HTML 이스케이프
3. CSP(Content Security Policy)
2.3 CSRF (Cross-Site Request Forgery)
[정상 사이트] [악의적인 사이트]
| |
| [사용자] |
| | |
| | |
| [요청] |
| | |
v v v
+-------------------------+
| 서버 |
+-------------------------+
[대응 방안]
+----------------------+
| 1. CSRF 토큰 사용 |
| 2. Referrer 검증 |
| 3. SameSite 쿠키 |
+----------------------+
3. 스프링 시큐리티 인증 흐름
[클라이언트 요청]
|
v
[인증 필터(AuthenticationFilter)]
|
v
[인증 관리자(AuthenticationManager)]
|
v
[인증 공급자(AuthenticationProvider)]
|
+---+---+
| |
v v
[UserDetails [PasswordEncoder]
Service]
| |
+---+---+
|
v
[보안 컨텍스트(SecurityContext)]
4. 주요 컴포넌트 설명
4.1 UserDetails
사용자 정보를 담는 핵심 인터페이스입니다.
+-------------------+
| UserDetails |
+-------------------+
| - username |
| - password |
| - authorities |
| - accountStatus |
+-------------------+
4.2 UserDetailsService
+-----------------------+
| UserDetailsService |
+-----------------------+
| + loadUserByUsername()|
+-----------------------+
^
|
+------------------+
| 구현체들 |
| - InMemory |
| - JDBC |
| - Custom |
+------------------+
4.3 PasswordEncoder
+------------------+
| PasswordEncoder |
+------------------+
| + encode() |
| + matches() |
+------------------+
^
|
+------------------+
| 구현체들 |
| - BCrypt |
| - PBKDF2 |
| - SCrypt |
+------------------+
5. 계층별 보안 적용
+--------------------------------+
| 표현 계층 |
| @PreAuthorize, @Secured |
+--------------------------------+
|
v
+--------------------------------+
| 서비스 계층 |
| @PreAuthorize, @Secured |
+--------------------------------+
|
v
+--------------------------------+
| 데이터 계층 |
| 데이터 필터링, 접근 제어 |
+--------------------------------+
각 계층별로 적절한 보안 조치를 적용해야 합니다:
표현 계층 (Controller)
- URL 기반 보안
- 메서드 수준 보안
서비스 계층
- 비즈니스 로직 보안
- 메서드 수준 보안
데이터 계층
- 데이터 접근 제어
- 필터링