1. Spring Security를 사용하는 이유를 알고, 개념에 대해 이해할 수 있다.
- Spring Security 개요
✔︎ Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization, 권한 부여) 기능을 지원하는 보안 프레임워크
✔︎ Spring MVC 기반 애플리케이션에 보안을 적용하기 위한 사실상 표준
✔︎ 다양한 유형(폼 로그인 인증, 토큰 기반 인증, OAuth2 기반 인증, LDAP 인증)의 사용자 인증 기능 적용
✔︎ 애플리케이션 사용자의 역할(Role)에 따른 권한 레벨 적용
✔︎ 애플리케이션에서 제공하는 리소스에 대한 접근 제어
✔︎ 민감한 정보에 대한 데이터 암호화
✔︎ SSL 적용
✔︎ 일반적으로 알려진 웹 보안 공격 차단
✔︎ 이 외 SSO, 클라이언트 인증서 기반 인증, 메서드 보안, 접근 제어 목록(Access Control List) 같은 보안을 위한 대부분 기능 지원
✔︎ Principal (주체)
✔︎ Authentication (인증)
✔︎ Authorization (인가 or 권한 부여)
Authentication
이 정상적으로 수행된 사용자에게 하나 이상의 권한(authority)을 부여하여 특정 애플리케이션의 특정 리소스에 접근할 수 있게 허가하는 과정✔︎ Credentical (신원 증명 정보)
Athentication
을 정상적으로 수행하기 위해 사용자를 식별하기 위한 정보✔︎ Access Control (접근 제어)
Access Control
은 사용자가 애플리케이션의 리소스에 접근하는 행위를 제어하는 것✔︎ 보안 기능을 밑바닥부터 구현하는 것보다, 검증되어 신뢰할만한 Spring Security를 사용하는 것이 더 나은 선택
✔︎ 특정 보안 요구 사항을 만족하기 위한 커스터마이징이 용이하고, 유연한 확장 가능
- Spring Security 기본 구조
✔︎ 폼 로그인 인증 방식
✔︎ Spring Security를 이용한 보안 설정
HttpSecurity
를 파라미터로 가짐SecurityFilterChain
을 리턴하는 Bean을 생성✔︎ HttpSecurity
를 통해 Spring Security에서 지원하는 보안 설정 구성 가능
✔︎ 로컬 환경에서 Spring Security를 테스트하기 위해서는 CSRF 설정을 비활성화 해야함
✔︎ InMemoryUserDetailsManager
를 이용해 데이터베이스 연동없이 테스트 목적의 InMemory User 생성 가능
✔︎ Spring Security에서 지원하는 InMemory User는 말 그대로 메모리에 등록되어 사용되는 User
✔︎ 애플리케이션 실행이 종료되면, InMemory User 역시 메모리에서 사라짐
✔︎ InMemory User를 사용하는 방식은 테스트 환경이나 데모 환경에서 사용할 수 있는 방법
✔︎ Spring Security는 사용자의 크리덴셜(Credential, 자격증명을 위한 구체적 수단)을 암호화 하기 위한 PasswordEncoder 제공
✔︎ PasswordEncoder는 다양한 암호화 방식 제공, 디폴트 암호화 알고리즘은 bcrypt
✔︎ 패스워드같은 민감한(sensitive) 정보는 반드시 암호화되어 저장되어야 함
✔︎ 패스워드는 복호화할 이유가 없기 때문에 단방향 암호화 방식으로 암호화
✔︎ Spring Security에서 SimpleGrantedAuthority
를 사용해 Role 베이스 형태의 권한을 지정할 때, 'ROLE_' + 권한명
형태로 지정해줘야 함
✔︎ Spring Security에서 관리하는 User 정보를 UserDetails
로 관리
✔︎ UserDetails
는 UserDetailsService에 의해 로드되는 핵심 User 정보를 표현하는 인터페이스
✔︎ UserDetailsService
는 User정보를 로드하는 핵심 인터페이스
✔︎ 일반적으로 인증을 시도하는 주체를 User(≒Principal)
라고 부름
※ Principal은 User의 더 구체적인 정보를 의미, 일반적으로는 Username을 의미
✔︎ CustomUserDetailsService를 사용해 로그인 인증을 처리하는 방식은 Spring Security가 내부적으로 인증을 대신 처리해주는 방식
✔︎ AuthenticationProvider
는 클라이언트로부터 전달받은 인증 정보를 바탕으로 인정된 사용자인지를 처리하는 Spring Security의 컴포넌트
- Spring Security의 웹 요청 처리 흐름
✔︎ Spring Security 아키텍쳐와 Spring Security의 컴포넌트들이 어떻게 인터렉션해서 인증, 권한 등의 보안 작업을 처리하는지 이해하지 못하기 때문
✔︎ 서블릿 필터 (Servlet Filter)
✔︎ 클라이언트의 요청을 중간에서 가로챈 뒤, 보안에 특화된 작업을 처리하는 역할
✔︎ DelegatingFilterProxy
✔︎ FilterChainProxy
※ Filter Chain : 보안을 위한 작업을 처리하는 필터 모음
- Filter와 FilterChain 구현
✔︎ 여러 개의 Filter가 체인을 형성하고 있는 Filter의 묶음
✔︎ Servlet FilterChain은 요청 URI path를 기반으로 HttpServletRequest 처리
✔︎ 클라이언트가 서버 측 애플리케이션에 요청을 전송하면, 서블릿 컨테이너는 요청 URI의 경로를 기반으로 어떤 Filter와 어떤 Servlet을 매핑할지 결정
✔︎ Filter는 Filter Chain 안에서 순서를 지정할 수 있으며 지정한 순서에 따라 동작하게 할 수 있음
※ Spring Boot에서는 FilterRegistrationBean
을 이용해 Filter 등록 가능
✔︎ Filter Chain에서 Filter의 순서는 매우 중요하며, Spring Boot에서 여러 개의 Filter를 등록하고 순서를 지정하기 위해 방법 적용 가능
@Order
애너테이션을 추가하거나 Orderd
인터페이스를 구현해서 Filter의 순서 지정 가능FilterRegistrationBean
의 setOrder()메서드를 이용해 Filter의 순서를 명시적 지정 가능
- DelegatingPasswordEncoder
✔︎ Spring Security에서 지원하는 PasswordEncoder
구현 객체를 생성해주는 컴포넌트
✔︎ DelegatingPasswordEncoder를 통해 애플케이션에서 사용할 PasswordEncoder를 결정하고, 결정된 PasswordEncoder로 사용자가 입력한 패스워드를 단방향으로 암호화해줌
✔︎ 패스워드 인코딩 방식을 마이그레이션하기 쉽지 않은 오래된 방식을 사용하고 있는 경우
✔︎ 스프링 시큐리티는 프레임워크이기 때문에 하위 호환성을 보장하지 않는 자주 업데이트 ❌
✔︎ DelegatingPasswordEncoder
를 사용해 다양한 방식의 암호화 알고리즘 적용 가능
✔︎ 암호화 알고리즘을 특별히 지정하지 않으면, Spring Security에서 권장하는 최신 암호화 알고리즘을 사용해 패스워드를 암호화할 수 있도록 해줌
✔︎ 패스워드 검증에 있어서도 레거시 방식의 암호화 알고리즘으로 암호화된 패스워드 검증을 지원
✔︎ Delegating : 나중에 암호화 방식을 변경하고 싶으면 언제든 암호화 방식 변경 가능
☞ 본격적으로 Spring Security에 발을 디뎠다. Principal, Authentication, Authorization 등등 여러 가지 새로 접하는 개념들을 맞이하고, 코드로도 알아볼 때 새로운 구성들이 많아 이해하는 데에 시간이 오래 걸릴 것 같았다 😂 수많은 복습이 필요할 때다...!! 주말을 이용해 앞으로 학습하게 될 내용들의 받침이 되기 위해 잘 복습해둬야겠다 :)
・ Spring Security 인증 구성요소 이해