오늘은 부트캠프 57일차이다. 프로젝트 2일차이고 내가 맡은 기능은 회원가입/로그인/로그아웃, jwt와 스프링 시큐리티를 이용하여 구현하는 것이다. 오늘은 서비스 이외 다른 기능을 구현을 하였고, 내일 포스트맨까지 해서 git까지 올리는 것이 목표인데 쉽지 많은 않을 것 같다. 벌써 오류 잡은 시간만 1~2시간 걸린 거 같다. 그리고 저번 프로젝트에서 시큐리티와 jwt를 안해보고 해보고 싶어서 한다고 했지만 너무 어려웠고 배울게 너무 많았다.
오늘 배운 것
1. Spring Security
- Spring 기반 애플리케이션에 인증과 권한 부여를 모두 제공하는 데 중점을 둔 프레임워크. 사실상 Spring 기반 애플리케이션 보안의 표본이다.
- Spring Security는 "인증"과 "권한(인가)"에 대한 부분을 Filter의 흐름에 따라 처리합니다.
- Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다.
- Spring Security는 기본적으로 인증 절차를 거친 후에 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인을 하게 된다.
- Spring Security에서는 이러한 인증과 인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 Credential 기반의 인증 방식을 사용한다.
- 용어 정리
- 접근 주체(Principal) : 보호된 Resource에 접근하는 유저
- 비밀번호(Credential): Resource에 접근하는 대상의 비밀번호
- 인증(Authenticate) : 접근 주체가 누구인지 확인
- 인가(Authorize) : 어떤 Resource에 접근할 수 있는 권한이 있는지 검사(ex. admin, user)
- 권한 : 인증된 주체가 Resource를 접근할 수 있도록 권한을 결정
- 웹 요청 권한, 메소드 호출 및 도메인 인스턴스에 대한 접근 권한 부여로 두 가지 영역이 존재
- Spring Security의 구조
인증 관련 architecture
- Spring Security는 세션-쿠키 방식으로 인증
- http request 요청
- AuthenticationFilter를 통해 (2→6) User까지 간다
- User에 있는 유저라면 UserDetails로 꺼내 session 생성 (7→0)
- spring security의 인메모리 세션 저장소인 SecurityContextHolder에 저장 (10)
- 유저에게 session ID와 함께 응답을 내려줌
- 이후 요청에서는 요청 쿠키에서 JSESSIONID를 까 봐서 검증 후 유효하면 Authentication를 쥐어준다.
- Spring Secutrity 필터 체인 구조
각 필터 별 기능 설명
- SecurityContextPersistenceFilter SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할 담당
- LogoutFilter 지정된 로그아웃 URL에 대한 요청을 감시하며, 매칭 되는 해당 유저를 로그아웃 처리
- UsernamePasswordAuthenticationFilter 사용자명과 비밀번호로 이뤄진 폼 기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행
- DefaultLoginPageGeneratingFilter 폼기반 또는 OpenID 기반 인증에 사용하는 가상 URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성
- BasicAuthenticationFilter HTTP 기본 인증 헤더를 감시하여 처리
- RequestCacheAwareFilter 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용
- SecurityContextHolderAwareRequestFilter HttpServletRequestWrapper를 상속한
- SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다.
- SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가정보를 제공
- AnonymousAuthenticationFilter 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증 토큰에 사용자가 익명 사용자로 나타난다
- SessionManagementFilter 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹 되도록 도운다.
- ExceptionTranslationFilter 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
- FilterSecurityInterceptor 이 필터는 AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해 준다.
- 특징
- 독립적인 운용을 지향
- 인증 및 권한 부여 모두에 대한 포괄적이고 확장 가능한 지원
- 세션 고정, 클릭재킹, 사이트 간 요청 위조 등의 공격으로부터 보호
- 서블릿 API 통합
- Spring Web MVC와의 선택적 통합, 즉 독립적
- 기능
- 사용자 권한에 따른 URI 접근 제어
- DB와 연동하는 Local strategy 로그인
- 쿠키를 이용한 자동 로그인
- 패스워드 암호화