개발 공부 기록

[Spring] Spring Security란? 본문

Spring/Development Log

[Spring] Spring Security란?

나만없서고냥이 2023. 9. 25. 19:10

✔️ Spring Security

Spring Security는 Spring Framework 기반의 애플리케이션의 보안(인증, 권한, 인가 등)을 구현하는 데 사용되는 보안 프레임워크입니다. 이를 사용하면 애플리케이션에서의 인증 및 권한 부여 관련 작업을 쉽게 처리할 수 있습니다. Spring Security의 주요 기능들은 아래와 같습니다.

 

1. Authentication(인증)

인증은 즉 '증명하는 것'으로, 사용자가 시스템에 로그인하는 방법을 다룹니다. 예를 들어, 사용자의 아이디와 패스워드를 사용하여 인증을 수행하거나, OAuth와 같은 다양한 인증 메커니즘을 지원합니다.

 

2. Authorization(인가, 권한 부여)

인증된 사용자에게 어떠한 작업을 수행할 수 있는지, 즉 권한을 부여하여 특정 리소스 혹은 기능에 대한 접근을 제어할 수 있습니다. Spring Security는 기본적으로 인증을 거친 후 인가 절차를 진행하며, 이때 해당 리소스에 대한 접근 권한이 있는지 확인합니다.

 

3. UserDetailsServices

사용자의 정보를 검색하는 데 사용되는 인터페이스입니다. 사용자 데이터베이스 등과 연동하여 사용자 정보를 가져오는 Custom 로직을 구현할 수 있습니다.

 

4. Security Filters

Spring Security는 필터(Filter)를 기반으로 작동합니다. 자세한 내용은 아래에서 다루겠습니다.

 

 

이외에도 Session 관리나 Remember Me와 같은 여러 기능 등을 제공합니다.


✔️ Spring Security 주요 모듈

Spring Security의 주요 모듈은 아래와 같이 구성되어 있습니다.

 

출처 : https://mangkyu.tistory.com/76

1. SecurityContextHolder

  • SecurityContext를 관리하고 제공합니다.

 

2. SecurityContext

  • 현재 사용자의 Authentication 객체를 담고 있습니다.
  • 즉, 접근 주체 및 인증에 대한 정보를 담고 있습니다.

 

3. Authentication

  • 사용자의 인증 정보를 나타냅니다.
  • 인증이 이루어지면 해당 Authentication이 SecurityContext에 저장됩니다.
  • SecurityContectHolder를 통해 SecurityContext에 접근하고, SecurityContext를 통해 Authentication에 접근할 수 있습니다.

 

4. Principal

  • 현재 인증된 사용자를 나타내는 객체로, 사용자의 식별 정보를 제공합니다.
  • 대부분의 경우 Principal로 UserDetails를 반환합니다.

 

5. GrantAuthority

  • 사용자에게 부여된 권한(역할)을 나타냅니다.
  • prefix로 'ROLE'이 붙으며 인증 이후 인가 과정에서 사용됩니다.

 

6. UsernamePasswordAuthenticationToken

  • 아이디와 패스워드를 사용하여 사용자 인증을 수행하는 Authentication의 구현체입니다.
  • 아이디가 Principal 역할을 하고, Password가 Credential 역할을 합니다.

 

7. Authentication Provider

  • 실제 사용자의 인증을 수행합니다.
  • Authentication 객체를 받아 인증이 완료된 객체를 반환합니다. 
  • Authentication Provider 인터페이스를 구현해서 Custom한 Authentication Provider을 작성하고, 이를 AuthenticationManager에 등록합니다.

8. Authentication Manager

  • Authentication 객체를 관리하고 Authentocation Provider에게 사용자 인증을 위임합니다.
  • 인증 성공시, 인증이 성공한 객체를 생성하여 SecurityContext에 저장합니다.

9. UserDetails

  • 사용자의 상세 정보를 나타냅니다. 
  • 주로 사용자의 아이디, 패스워드, 권한 정보 등을 포함합니다.

10. UserDetailsService

  • 데이터베이스 등에서 사용자 정보를 가져오는 데 사용됩니다.
  • 'loadByUsername' 메서드를 구현하여 사용자 정보를 반환합니다.

✔️ Spring Security Filter

Spring Security의 필터는 요청을 가장 먼저 받는 Dispatcher servlet으로 가기 전에 적용되어 여러 보안 필터를 이용해 다양한 처리를 수행합니다. 이렇게 제공되는 필터들을 Security Filter Chain이라고 합니다. 

 

출처 :  https://atin.tistory.com/590

몇 가지 주요 Spring Security 필터에 대해 정리해 보도록 하겠습니다.

 

1. SecurityContextPersistenceFilter:

사용자의 인증 정보가 저장된 SecurityContext를 가져오거나 저장하는 역할을 합니다.

 

2. (UsernamePassword)AuthenticationFilter

  • 아이디와 패스워드를 사용한 form 기반의 인증을 처리합니다. 
  • AuthenticationManager를 통하여 인증을 실행합니다.
    > 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
    > 실패 시, AuthenticationFailureHandler 실행

3. BasicAuthenticationFilter 

HTTP 기본 인증을 처리하는 필터로, 사용자가 요청에 HTTP 헤더를 포함하여 인증 정보를 제공할 때 사용됩니다.

 

4. DefaultLoginPageGeneratingFilter

인증을 위한 로그인폼 URL로 오는 요청을 감시합니다.

 

5.  LogoutFilter

설정된 로그아웃 URL로 오는 요청을 감시하며, 사용자를 로그아웃 처리합니다.

 

6. CsrfFilter

CSRF(Cross-Site Request Forgery) 공격을 방어하기 위한 필터로, 요청의 CSRF 토큰을 확인하고 유효하지 않은 요청을 차단합니다.

 

7. CorsFilter

CORS(Cross-Origin Resource Sharing) 요청을 처리하는 필터로, 다른 도메인에서의 요청을 허용하도록 설정할 수 있습니다.

 

8. ExceptionTranslationFilter

인증 및 권한 예외를 적절한 HTTP 응답 코드로 변환하는 역할을 합니다. 예를 들어, 인증되지 않은 사용자가 보호된 리소스에 접근하려 할 때 401 Unauthorized 응답을 생성합니다.

 

9. SessionManagementFilter

인증된 사용자와 관련된 모든 세션을 추적합니다.

 

 

Spring Security가 위와 같이 다양한 필터를 제공하는 이유는 웹 애플리케이션의 다양한 보안 요구 사항을 처리하기 위함입니다. 또한 필요한 기능만을 활성화하여 애플리케이션의 불필요한 처리도 줄일 수 있습니다.

우리는 이중 어떠한 필터를 적용할 것인지 선언만 해주면 Spring Security가 그에 해당하는 보안을 수행하게 됩니다.


✔️ Spring Security Architecture

아이디와 암호를 입력하였을 때 이를 처리하는 AuthenticationFilter의 동작 순서를 알아봅시다.

출처 : http://www.springbootdev.com

1. 사용자가 아이디와 패스워드를 입력하여 로그인을 시도합니다. (즉, 로그인 요청을 보냅니다.)

 

2. AuthenticationFilter는 요청을 감지하고, 사용자의 아이디와 패스워드를 추출하여 UsernamePasswordAuthenticationToken을 생성합니다.

 

3. AuthenticationFilter는 생성한 UsernamePasswordAuthenticationTokenAuthenticationManager에 전달합니다.

 

4. AuthenticationManagerAuthenticationProvider를 사용하여 사용자의 아이디와 패스워드를 검증합니다. 이때 UserDetailsService를 사용하여 데이터베이스에서 사용자 정보를 가져올 수 있습니다.

 

5. AuthenticationProvider는 인증이 성공하면 Authentication 객체를 생성하고 반환합니다. 이 객체에는 사용자의 인증 정보와 권한 정보가 포함됩니다.

 

6. AuthenticationFilterAuthentication 객체를 확인하여 인증이 성공했는지 또는 실패했는지를 판단하고, 그에 따라 적절한 동작을 수행합니다. 인증 성공 시 사용자는 리소스에 접근이 가능합니다.

 

 

다음 글에서 이러한 Spring Security를 적용하여 회원가입 로직을 구현해 보겠습니다.


References

https://m.boostcourse.org/web326/lecture/58997

 

웹 백엔드

부스트코스(boostcourse)는 모두 함께 배우고 성장하는 비영리 SW 온라인 플랫폼입니다.

m.boostcourse.org

 

https://mangkyu.tistory.com/76

 

[SpringBoot] Spring Security란?

대부분의 시스템에서는 회원의 관리를 하고 있고, 그에 따른 인증(Authentication)과 인가(Authorization)에 대한 처리를 해주어야 한다. Spring에서는 Spring Security라는 별도의 프레임워크에서 관련된 기능

mangkyu.tistory.com

https://king-ja.tistory.com/68

 

Spring Security란

1. Spring Security란? [Spring Security란 ?] Spring Security는 Spring 기반의 애플리케이션의 보안(인증, 권한, 인가 등)을 담당하는 스프링 하위 프레임워크입니다. 이 프레임워크를 사용하면 보안처리를 자체

king-ja.tistory.com