스프링

스프링 시큐리티 - 간단한 인증절차 정리

개발자 포비 2024. 12. 16. 16:37

1. 스프링 시큐리티의 인증과 인가

1.1 인증 (Authentication)

사용자 요청 ---> 인증 필터 ---> 인증 성공/실패
    |
    |     +------------------------+
    |     |   인증 프로세스        |
    +---> |   1. 자격증명 확인     |
          |   2. 사용자 존재 확인   |
          |   3. 비밀번호 검증     |
          +------------------------+

인증은 사용자가 본인이 맞는지를 확인하는 과정입니다. 일반적으로 다음 단계를 거칩니다:

  1. 사용자가 자격증명(credentials)을 제공
  2. 시스템이 해당 정보를 검증
  3. 인증 성공 시 보안 컨텍스트에 인증 정보 저장

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
+--------------------------------+
|         데이터 계층             |
|  데이터 필터링, 접근 제어       |
+--------------------------------+

각 계층별로 적절한 보안 조치를 적용해야 합니다:

  1. 표현 계층 (Controller)

    • URL 기반 보안
    • 메서드 수준 보안
  2. 서비스 계층

    • 비즈니스 로직 보안
    • 메서드 수준 보안
  3. 데이터 계층

    • 데이터 접근 제어
    • 필터링