참조한 강의 : Spring & Hibernate For Beginners (www.udemy.com/course/spring-hibernate-tutorial/)
- Spring Security
Spring Security 는 Spring Framework 기반의 자바 어플리케이션 개발시에 사용되는 보안관련 프로젝트로, 유저에 대한 인증, 권한 관리, 암호화 등의 기능을 사용할때 주로 사용된다.
웹 사이트에 기본적으로 탑재되어 있는 로그인, 회원가입 등의 기능을 개발할때 사용된다.
- 작업 흐름
Spring Security 를 통해서 작업을 할때 이뤄지는 전체적인 흐름을 간략하게 그림으로 표현하면 아래와 같다.
웹 브라우저로부터 어떤 요청이 들어오면,
해당 요청이 만약 암호화된 웹 리소스에 대한 접근 요청이면
Spring Security 가 자체적으로 가지고 있는 Spring Security Filter 라는것을 통해서 인증된 유저의 요청인지 검증한다.
검증을 위해서 Spring Framework 에 개발자가 명시해둔 configuration 에 들어가서 DB 에 해당 유저의 비밀번호, role 등을 찾아내어 검증된 유저인지 파악한다
검증된 유저라면, 해당 웹 리소스에 대한 접근을 허용해주고 이를 response 로 보내주는 식이다.
- Spring Security Filter
: Spring Security Filter 가 하는 일을 아주 간략한 순서도로 나타내면 아래와 같다
1) 해당 웹 리소스가 보호된 리소스 인가?
-> 아니면 그냥 리소스를 유저에게 리턴해주고 아니라면 유저가 인증된 유저인지 아닌지 검증한다
2) 리소스 요청을 한 유저가 인증된 유저인가?
-> 아니라면, 로그인을 해서 인증하도록 유도하고, 인증된 유저라면 해당 유저가 권한이 있는지 파악한다
3) 권한이 있는 유저인가?
-> 다른 포스팅에서 언급할것이지만, Spring Security 를 사용하면 각 유저별로 Role 을 부여할 수 있다.
그래서 이 Role 에 따라서 해당 유저가 권한이 있는 유저인지 아닌지 판별할 수 도 있다.
- Authentication 과 Authorization
두 단어를 그냥 사전적으로만 찾으면, 의미가 비슷해보여서 별 차이가 없는것 처럼 느껴지기도 하는데
여기서 두 단어의 의미는 서로 다른 의미로 사용된다
먼저 전자(Authentication) 는 DB 혹은 (잘 안쓰지만) 앱의 메모리 내에 있는 유저의 id 와 password 값을 비교해서 해당 유저가 어떤 유저인지 파악하는 의미로 사용된다.
반면에 후자(Authorization) 는 해당 유저의 권한이 어디까지 인가를 나타낸다
예를들어, 인사관리 앱이 있다고 하면, 직원이 접근할 수 있는 사내 홈페이지 범위와 고용주가 접근할 수 있는 사내 홈페이지 범위가 각각 다를 것이다. 바로 이런것들이 해당한다
- Declarative Security, Programmatic Security
: 이 두 용어는 spring security 설정시에, 기본적으로 spring security 가 제공하는 어노테이션이나 xml 을 통해서 명시를 할것인지 (전자) 아니면,
기본적으로 제공하는 spring security api 에 추가적으로 다른 커스텀한 기능들을 넣고 싶을때 사용할것인지 (후자) 의 차이이다.
참고 (www.interviewgrid.com/interview_questions/javaee/security)
Declarative Security - Declarative security specifies an application's security requirements by using either deployment descriptors or annotations.
Programmatic Security - Programmatic security implements an application's security within the application code.
- 세션, 쿠키 방식
앞에서 아주 간략하게 spring security filter 가 동작하는 모습을 순서도로 보여줬지만 좀 더 자세히 파고들어가 보면 아래 그림과 같이 표현된다
Spring Security 가 기본적으로 사용하는 인증 방식은 세션-쿠키 방식이다.
(참고 : 쿠키, 세션, 토큰 : sdy-study.tistory.com/44)
1) 유저가 로그인을 시도하면 (request 가 왔을때)
2) AuthenticationFilter 를 거쳐서 DB 로 접속을 한다.
3) DB 에 있는 유저면 위 그림의 UserDetails 로 관련 데이터를 꺼내서 유저의 Session 을 생성한다.
4) Spring Security 의 in-memory 세션 저장소인 SecurityContextHolder 에 세션을 저장한다
5) 유저에게 session id 와 response 를 보낸다.
6) 이 이후 요청 부터는 request cookie 에 JSESSIONID 라는 값을 검사한뒤 유효하면 인증된 유저로 쳐준다.
- Filters
: 사실 앞에선 매우 간략화 하기 위해 Spring Security Filter 를 딱 하나만 있는것 처럼 언급했지만
알고보면 상당히 많은 Filter 들이 존재하고 그 Filter 들 하나하나가 서로 다른 기능을 담당하고 있다.
Spring Security 내부의 여러개의 filter 들을 Filter Chain 이라 부르며, 각 Filter 들의 기능을 요약하면 아래와 같다
1. SecurityContextPersistenceFilter : SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다.
2. LogoutFilter : 설정된 로그아웃 URL로 오는 요청을 감시하며, 해당 유저를 로그아웃 처리
3. (UsernamePassword)AuthenticationFilter : (아이디와 비밀번호를 사용하는 form 기반 인증) 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리
1) AuthenticationManager를 통한 인증 실행
2) 인증 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
3) 인증 실패 시, AuthenticationFailureHandler 실행
4. DefaultLoginPageGeneratingFilter : 인증을 위한 로그인폼 URL을 감시한다.
5. BasicAuthenticationFilter : HTTP 기본 인증 헤더를 감시하여 처리한다.
6. RequestCacheAwareFilter : 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용된다.
7. SecurityContextHolderAwareRequestFilter
: HttpServletRequestWrapper를 상속한 SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다.
SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가정보를 제공한다.
8. AnonymousAuthenticationFilter : 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로 나타난다.
9. SessionManagementFilter : 이 필터는 인증된 사용자와 관련된 모든 세션을 추적한다.
10. ExceptionTranslationFilter : 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
11. FilterSecurityInterceptor : 이 필터는 AccessDecisionManager 로 권한부여 처리를 위임함으로써 접근 제어 결정을 쉽게해준다.
여기 가지 대략적으로 Spring Security 가 무엇인지 알아봤다
다음 포스팅에서는 Spring Security 를 프로젝트에 설정하는 방법과 간단한 로그인 예제를 작성해본다.
- References)
1. Spring Security 파헤치기 : sjh836.tistory.com/165
2. Spring Security Authentication Architecture : springbootdev.com/2017/08/23/spring-security-authentication-architecture/
'Spring' 카테고리의 다른 글
Spring Security - Custom Login Form (0) | 2021.03.05 |
---|---|
Spring Security - Configuration (0) | 2021.03.05 |
Maven 이란 (0) | 2021.02.25 |
Spring Framework - AOP 코드 예제 (0) | 2021.02.24 |
Spring Framework - AOP Overview (0) | 2021.02.17 |