개발 공부 기록
[Spring] Spring Security란? 본문
✔️ 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의 주요 모듈은 아래와 같이 구성되어 있습니다.
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이라고 합니다.
몇 가지 주요 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의 동작 순서를 알아봅시다.
1. 사용자가 아이디와 패스워드를 입력하여 로그인을 시도합니다. (즉, 로그인 요청을 보냅니다.)
2. AuthenticationFilter는 요청을 감지하고, 사용자의 아이디와 패스워드를 추출하여 UsernamePasswordAuthenticationToken을 생성합니다.
3. AuthenticationFilter는 생성한 UsernamePasswordAuthenticationToken을 AuthenticationManager에 전달합니다.
4. AuthenticationManager는 AuthenticationProvider를 사용하여 사용자의 아이디와 패스워드를 검증합니다. 이때 UserDetailsService를 사용하여 데이터베이스에서 사용자 정보를 가져올 수 있습니다.
5. AuthenticationProvider는 인증이 성공하면 Authentication 객체를 생성하고 반환합니다. 이 객체에는 사용자의 인증 정보와 권한 정보가 포함됩니다.
6. AuthenticationFilter는 Authentication 객체를 확인하여 인증이 성공했는지 또는 실패했는지를 판단하고, 그에 따라 적절한 동작을 수행합니다. 인증 성공 시 사용자는 리소스에 접근이 가능합니다.
다음 글에서 이러한 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
'Spring > Development Log' 카테고리의 다른 글
[Spring] Session 기반과 JWT 기반의 인증 (0) | 2023.12.09 |
---|---|
[SpringBoot] 이메일 발송 기능 구현하여 이메일 인증 코드 발송하기 (1) | 2023.12.05 |
[Spring] Logback을 사용하여 에러 로깅하기 (1) | 2023.12.04 |
[SpringBoot] @Vaild를 통해 회원가입에 Validation 적용 (0) | 2023.12.01 |
[SpringBoot] Spring Security를 통해 회원가입 구현 (0) | 2023.09.27 |