62DAYS) [Spring Security] 기본 - Spring Security 개요

nacSeo (낙서)·2023년 1월 13일
0

◉ 학습목표

1. Spring Security를 사용하는 이유를 알고, 개념에 대해 이해할 수 있다.
  1. Spring Security 개요

⦿ 학습내용

☞ Spring Security

✔︎ Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization, 권한 부여) 기능을 지원하는 보안 프레임워크
✔︎ Spring MVC 기반 애플리케이션에 보안을 적용하기 위한 사실상 표준

☞ Spring Security로 할 수 있는 보안 강화 기능

✔︎ 다양한 유형(폼 로그인 인증, 토큰 기반 인증, OAuth2 기반 인증, LDAP 인증)의 사용자 인증 기능 적용
✔︎ 애플리케이션 사용자의 역할(Role)에 따른 권한 레벨 적용
✔︎ 애플리케이션에서 제공하는 리소스에 대한 접근 제어
✔︎ 민감한 정보에 대한 데이터 암호화
✔︎ SSL 적용
✔︎ 일반적으로 알려진 웹 보안 공격 차단
✔︎ 이 외 SSO, 클라이언트 인증서 기반 인증, 메서드 보안, 접근 제어 목록(Access Control List) 같은 보안을 위한 대부분 기능 지원

☞ Spring Security 용어 정리

✔︎ Principal (주체)

  • 일반적으로 인증 프로세스가 성공적으로 수행된 사용자의 계정 정보

✔︎ Authentication (인증)

  • 애플리케이션을 사용하는 사용자가 본인이 맞음을 증명하는 절차

✔︎ Authorization (인가 or 권한 부여)

  • Authentication이 정상적으로 수행된 사용자에게 하나 이상의 권한(authority)을 부여하여 특정 애플리케이션의 특정 리소스에 접근할 수 있게 허가하는 과정

✔︎ Credentical (신원 증명 정보)

  • Athentication을 정상적으로 수행하기 위해 사용자를 식별하기 위한 정보

✔︎ Access Control (접근 제어)

  • Access Control은 사용자가 애플리케이션의 리소스에 접근하는 행위를 제어하는 것

☞ Spring Security를 사용하는 이유

✔︎ 보안 기능을 밑바닥부터 구현하는 것보다, 검증되어 신뢰할만한 Spring Security를 사용하는 것이 더 나은 선택
✔︎ 특정 보안 요구 사항을 만족하기 위한 커스터마이징이 용이하고, 유연한 확장 가능

  1. Spring Security 기본 구조

⦿ 학습내용

☞ Spring Security 기본 구조 (1)

✔︎ 폼 로그인 인증 방식

  • Spring Security의 기본 구조와 기본적인 동작 방식을 이해하기 가장 좋은 인증 방식

✔︎ Spring Security를 이용한 보안 설정

  • HttpSecurity를 파라미터로 가짐
  • SecurityFilterChain을 리턴하는 Bean을 생성

✔︎ HttpSecurity를 통해 Spring Security에서 지원하는 보안 설정 구성 가능
✔︎ 로컬 환경에서 Spring Security를 테스트하기 위해서는 CSRF 설정을 비활성화 해야함
✔︎ InMemoryUserDetailsManager를 이용해 데이터베이스 연동없이 테스트 목적의 InMemory User 생성 가능

☞ Spring Security 기본 구조 (2)

✔︎ 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의 컴포넌트

  1. Spring Security의 웹 요청 처리 흐름

⦿ 학습내용

☞ Spring Security를 애플리케이션에 적용하는데 어려움을 겪는 가장 큰 이유

✔︎ Spring Security 아키텍쳐와 Spring Security의 컴포넌트들이 어떻게 인터렉션해서 인증, 권한 등의 보안 작업을 처리하는지 이해하지 못하기 때문

☞ 보안이 적용된 웹 요청의 일반적인 처리 흐름

☞ 웹 요청에서의 서블릿 필터와 필터 체인의 역할

✔︎ 서블릿 필터 (Servlet Filter)

  • 서블릿 기반 애플리케이션의 엔드포인트에 요청이 도달하기 전에, 중간에 요청을 가로챈 후 처리를 할 수 있도록 해주는 Java 컴포넌트
  • 하나 이상의 필터들을 연결해 필터 체인(Filter Chain)을 구성

☞ Spring Security에서의 필터 역할

✔︎ 클라이언트의 요청을 중간에서 가로챈 뒤, 보안에 특화된 작업을 처리하는 역할
✔︎ DelegatingFilterProxy

  • 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할

✔︎ FilterChainProxy

  • Spring Security의 Filter를 사용하기 위한 진입점

Filter Chain : 보안을 위한 작업을 처리하는 필터 모음

  1. Filter와 FilterChain 구현

⦿ 학습내용

☞ Filter

☞ Filter Chain

✔︎ 여러 개의 Filter가 체인을 형성하고 있는 Filter의 묶음

☞ Filter와 Filter Chain의 특성

✔︎ Servlet FilterChain은 요청 URI path를 기반으로 HttpServletRequest 처리
✔︎ 클라이언트가 서버 측 애플리케이션에 요청을 전송하면, 서블릿 컨테이너는 요청 URI의 경로를 기반으로 어떤 Filter와 어떤 Servlet을 매핑할지 결정
✔︎ Filter는 Filter Chain 안에서 순서를 지정할 수 있으며 지정한 순서에 따라 동작하게 할 수 있음
※ Spring Boot에서는 FilterRegistrationBean을 이용해 Filter 등록 가능

✔︎ Filter Chain에서 Filter의 순서는 매우 중요하며, Spring Boot에서 여러 개의 Filter를 등록하고 순서를 지정하기 위해 방법 적용 가능

  • Spring Bean으로 등록되는 Filter에 @Order 애너테이션을 추가하거나 Orderd 인터페이스를 구현해서 Filter의 순서 지정 가능
  • FilterRegistrationBean의 setOrder()메서드를 이용해 Filter의 순서를 명시적 지정 가능
  1. DelegatingPasswordEncoder

⦿ 학습내용

☞ DelegatingPasswordEncoder

✔︎ Spring Security에서 지원하는 PasswordEncoder 구현 객체를 생성해주는 컴포넌트
✔︎ DelegatingPasswordEncoder를 통해 애플케이션에서 사용할 PasswordEncoder를 결정하고, 결정된 PasswordEncoder로 사용자가 입력한 패스워드를 단방향으로 암호화해줌

☞ DelegatingPasswordEncoder 도입 전 문제점

✔︎ 패스워드 인코딩 방식을 마이그레이션하기 쉽지 않은 오래된 방식을 사용하고 있는 경우

  • 항상 고정된 암호화 방식 사용하는 것은 바람직한 사용 방식 ❌

✔︎ 스프링 시큐리티는 프레임워크이기 때문에 하위 호환성을 보장하지 않는 자주 업데이트 ❌

☞ DelegatingPasswordEncoder 장점

✔︎ DelegatingPasswordEncoder를 사용해 다양한 방식의 암호화 알고리즘 적용 가능
✔︎ 암호화 알고리즘을 특별히 지정하지 않으면, Spring Security에서 권장하는 최신 암호화 알고리즘을 사용해 패스워드를 암호화할 수 있도록 해줌
✔︎ 패스워드 검증에 있어서도 레거시 방식의 암호화 알고리즘으로 암호화된 패스워드 검증을 지원
✔︎ Delegating : 나중에 암호화 방식을 변경하고 싶으면 언제든 암호화 방식 변경 가능

  • 기존 암호화되어 저장된 패스워드에 대한 마이그레이션 작업이 진행되어야 함

◉ 느낀 점

☞ 본격적으로 Spring Security에 발을 디뎠다. Principal, Authentication, Authorization 등등 여러 가지 새로 접하는 개념들을 맞이하고, 코드로도 알아볼 때 새로운 구성들이 많아 이해하는 데에 시간이 오래 걸릴 것 같았다 😂 수많은 복습이 필요할 때다...!! 주말을 이용해 앞으로 학습하게 될 내용들의 받침이 되기 위해 잘 복습해둬야겠다 :)

◉ 내일의 키워드

・ Spring Security 인증 구성요소 이해
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글