스프링 시큐리티 개요

Daniel_Yang·2023년 7월 28일
0
post-thumbnail

스프링 시큐리티 내용이 많다보니 개요와 전체적인 흐름, 사용법을 나눠서 정리하겠다.

시작하면서

스프링 시큐리티, 이름도 거창하다. 특히 국비지원 학원을 다닐 때도 프로젝트에 꼭 넣었으면 좋겠다고들 하지만, 정작 진행하려고 하면 너무 어려워서 그냥 복붙했던 것 같다. 실무에서 적용하려고 할 때도 너무 어려워서 책, 강의 등을 찾았다. 하지만 돌이켜보면 가장 중요한 것은 스프링 시큐리티 레퍼런스와 용어들, 그리고 흐름을 알면 되는 것이었다! Spring Oauth Client2 를 사용하면서 이번에 제대로 정리해보려고 한다.


소개

스프링 시큐리티는 무엇인가요?

  • Spring Security는 인증, 인가 및 일반적인 공격에 대한 보호를 제공하는 프레임워크입니다. 명령형 및 반응형 애플리케이션 모두를 보호하기 위한 최고 수준의 지원을 통해 Spring 기반 애플리케이션을 보호하기 위한 사실상의 표준입니다. (출처: docs.spring.io/spring-security)
  • 스프링 시큐리티는 강력하고 매우 유연한 스프링 하위 프레임워크 로 자바 기반의 엔터프라이즈 소프트웨어에 보안을 제공합니다. (출처: 위키피디아)
  • 광범위한 보안 요구사항을 해결할 수 있도록 돕는 일련의 서비스와 서블릿 API의 확장을 제공합니다.(출처: chatGPT)

본인 요약: 스프링의 시큐리티(보안)이라는 용어처럼 스프링 생태계와 잘 어울리며, 사실상의 표준이자 (통합성) 많은 기능들을 제공한다. 특히 엔터프라이즈 애플리케이션 보안을 제공한다.


특징은요?

  • Spring Security에서는 인증, 인가에 대한 처리를 여러개의 필터를 연쇄적으로 실행하여 수행
  • Spring Security는 비즈니스 로직과 Security을 분리해서 제공(출처: 블로그)
  • 스프링 프레임워크에 통합되어있다보니 거대한 개발자 커뮤니티가 있다.
  • 메시지에 대한 현지화를 지원
  • 구현해야하는 인터페이스들을 제공한다.

주요 기능

스프링 시큐리티는 대략적으로 무엇을 제공해주나요?

  1. 인증
    인증은 특정 리소스에 액세스하려는 사람의 신원을 확인하는 방법이다. 스프링 시큐리티는 강력한 인증 메커니즘을 제공하여 사용자가 누구인지 확인하고, 다양한 인증 방식을 지원한다.
  1. 인가
    사용자가 인증되면, 스프링 시큐리티는 사용자가 시스템에서 수행할 수 있는 작업을 결정하는 인가 프로세스를 제공합니다. 이는 사용자 역할에 기반한 접근 제어와 더욱 세밀한 접근 제어 전략을 지원한다.
  1. 일반적인 공격에 대한 보호
    스프링 시큐리티는 일반적인 웹 기반 공격을 방어하는 기능을 제공합니다. 보통은 CSRF를 대표적으로 많이 이야기한다.
  • 종류
    1. CSRF
    2. XSS
    3. 세션 고정 공격
    4. SQL 주입
    5. 인증, 인가 공격
    6. 중간자 공격
    7. 클릭 재킹

쉽게 말해, 암행어사 출두야 API를 시전하고 싶다면,

  • 인증: 먼저 내 신분, 직위를 확인해야한다. 마패(username, password)를 통해 암행어사임을 확인
  • 인가: 나는 이제부터 암행어사다. 근데, 암행어사여서 뭐? 암행어사(Role)에게 허락된 권한이 출두야(RoleAuthority) 이기 때문에 암행어사라면 출두야를 외칠 수 있는 것이다.

좀 더 자세한 기능들은요?

  • Method Security: 서비스 계층의 메소드에 보안을 추가
  • Remember-Me: 단순히 아이디를 기억해놓는 것이 아니라 로그인 정보를 유지하는 것
  • 암호화
  • 세션 관리 솔루션
  • CSRF 방지: 세션 사용할 때 CSRF 발생 가능성 => 2차 비밀번호로(토큰) 한 번의 인증 참고
  • 스프링 시큐리티는 사용자 정보를 UserDetails 구현체로 사용

대안

1. 대안 선택 시 고려사항

  • 보안 요구사항, 기존의 기술스택들과의 통합성, 학습 난이도 등 고려

2. 스프링 시큐리티 반드시 사용해야하나? 다른 건 없나요?

현재 최신 버전이 6.1.2인 만큼, 업데이트가 자주 되는 편이고 그로 인해 사람들의 불만과 학습 난이도가 어려워지는 것 같다는 불만이 많은 것 같다. 특히,WebSecurityConfigurerAdapter Deprecated 등...
유튜브 댓글 반응들 참고

chatGPT 추천 대안

  1. Apache Shiro: Apache Shiro는 인증, 권한부여, 암호화, 세션 관리를 처리하는 강력하고 유연한 오픈소스 보안 프레임워크입니다. Shiro는 스프링 시큐리티처럼 스프링 부트와의 깊은 통합은 가지고 있지 않지만, 간결함과 직관성으로 알려져 있습니다.
    Apache-Integrating Apache Shiro into Spring-Boot Applications
    Introduction to Apache Shiro
    스프링 시큐리티 vs Apache Shiro
    한글-Apache Shiro 소개

  2. OAuth2: OAuth2는 스프링 시큐리티와 함께 자주 사용되지만, 인증 프로토콜로서 별도로 사용될 수도 있습니다. OAuth2를 사용하면 사용자가 암호를 제공하지 않고도 앱에 다른 애플리케이션에서의 정보 접근 권한을 부여할 수 있습니다. 이는 사용자의 실제 로그인 자격 증명을 다룰 필요가 없는 더 안전한 로그인 시스템을 생성하는 데 사용할 수 있습니다.
    Spring Boot and OAuth2 공식 가이드
    스프링 시큐리티없이 OAuth 로그인 구현하기

  3. Keycloak: Keycloak는 OpenID Connect, OAuth2, SAML과 같은 표준 프로토콜을 지원하는 오픈소스 신원 및 접근 관리 솔루션입니다. Keycloak은 Single-Sign On, Identity Brokering, Social Login, User Federation 등의 기능을 제공합니다. 스프링 시큐리티와 다른 목적으로 사용되기에 대안이라기보다는, 연동해서 사용한다. 쉽게 말해, Keycloak은 사용자 ID 및 SSO를 처리, Spring Security는 애플리케이션의 더 세밀하고 복잡한 보안 요구 사항을 처리.

    Baeldung-A Quick Guide to Using Keycloak With Spring Boot
    Spring Boot에서 Keycloak 사용에 대한 빠른 사용방법
    keycloak 스프링부트 적용기

  1. Okta: Okta는 신원 관리 및 단일 로그인 서비스를 제공하는 상업용 제품입니다. Okta는 스프링 부트와 잘 작동하는 라이브러리를 가지고 있어 스프링 시큐리티에 대한 대안이 될 수 있습니다. 구글링해보니 한글 참고자료가 적어서 진입장벽이 조금은 있을 것.
    Okta - Add user authentication to your Spring app
    공식 깃허브
    BaelDung - springsecurity with okta

=> 그럼에도 스프링시큐리티가 스프링 생태계와 잘 어울리고, 엔터프라이즈 애플리케이션 보안을 제공하기에 실무에 사용하기에는 무난한 것 같다.


알아야하는 용어 => 잘 익히자

기본적인 용어

영어용어설명
Authenticate인증접근하려는 유저가 누구인지 확인하는 절차(회원가입, 로그인)
Authorization인가인증된 사용자에 대해서 권한을 확인하고 허락하는 것
Context저장공간
Grant부여
Provider제공자
Manager관리자처리를 담당한다.
Role역할여러 Authorities를 포함할 수 있는 포괄적인 permission
Authority권한Authorities는 기능 단위의 permission

인증에 관한 컴포넌트

  • 스프링 시큐리티에서 인증을 이용하기 위해 알아야할 클래스 및 인터페이스
영어용어설명
Principal접근 주체보호된 대상에 접근하는 유저
Credential비밀번호대상에 접근하는 유저의 비밀번호
UserDetails인증 부과 정보유저 정보를 UserDetails 구현체로 사용
UserDetailsService로드된 사용자를 기반으로 UserDetails 객체를 생성하는 ServiceloadUserByUsername(String) 메서드를 구현
SecurityContextHolderSecurityContext 사용
SecurityContext인증된 사용자가 저장되는 저장소SecurityContextHolder 와 Authentication 을 포함(접근 주체와 인증에 대한 정보를 담고 있는 Context).
Authentication사용자가 인증을 위해 제공한 자격증명 또는 현재 사용자의 증명 제공
GrantedAuthority부여된 권한Role과 Authority 모두 부여된 권한으로 취급한다.
AuthenticationManager스프링 시큐리티의 인증을 담당스프링이 어떻게 인증을 할지 정의한 인터페이스
ProviderManagerAuthenticationManager 실제 구현 객체AuthenticationProvider 중에 인증이 가능한 인터페이스를 찾음
AuthenticationProviderProviderManager가 인증이 가능한 구현 객체를 찾음
AuthenticationEntryPoint클라이언트에게 인증을 요청
PasswordEncoder원시 비밀번호 인코딩메서드: encode, matches
SecurityFilterChain연쇄적인 보안 필터 체인여러개의 필터를 연쇄적으로 실행

공식 레퍼런스

스프링시큐리티 가이드
스프링-스프링시큐리티 레퍼런스
5.4.6버전 스프링시큐리티 기본 구조
5.3.2버전 한글화 문서
사용법 위주의 웹애플리케이션 보안
스프링시큐리티 버전 및 샘플

참고사항

1. 컴포넌트라는 용어

  • UsernamePasswordAuthenticationFilter, SecurityFilterChain,
    SecurityContext, Authentication 등을 스프링시큐리티 컴포넌트 라고 생각하면 된다.

2. 스프링시큐리티는 왜 프레임워크인가?

스프링 공식 문서
Spring Security is a powerful and highly customizable authentication and access-control framework. ... Spring Security is a framework that focuses on providing both authentication and authorization to Java applications

  • 스프링 시큐리티는 보안 문제를 해결하는데 필요한 전체적인 솔루션을 제공하기에 프레임워크다.
  • 프레임워크는 실제로 JAR(Java ARchive) 파일로 제공되며, 이는 애플리케이션에 라이브러리처럼 포함될 수 있어서 라이브러리라고 생각할 수도 있는 것이다.
  • 하지만, 라이브러리와 프레임워크의 구분은 그것들이 어떻게 패키지화되거나 애플리케이션에 포함되는 방법이 아니라, 제어 흐름과 개발자가 코드 실행에 대해 얼마나 제어할 수 있는지의 차이 다.
  • 따라서 프레임워크는 라이브러리처럼 JAR 파일로 제공될 수 있지만, 애플리케이션 내에서의 역할과 사용 방식은 근본적으로 다르다. (출처: chatGPT)

  • 프레임워크: 어플리케이션의 흐름을 제어하고, 주도하는 데 사용되는 템플릿
  • 라이브러리: 일반적으로 재사용 가능한 코드 조각이나 기능을 모듈화하고 패키징하여 다른 프로그램에서 호출하여 사용할 수 있도록 만들어진 코드 모음

3. Resource

  • 스프링 시큐리티는 웹 요청(Web Request)에 기반한 보안을 제공 하는 것이 주 목적이며, 인가 프로세스를 통해 자원에 대한 접근을 제어할 수 있다.
  • 이 때 자원은 웹 페이지, REST API, DB 레코드 등을 의미한다.
  • 인증과 인가 과정을 통해 리소스의 보안을 유지하고, 적절한 사용자만이 적절한 자원에 접근하도록 보장

4. Role vs Authority

  • Role과 Authority는 사용자에게 부여된 권한을 나타내는 데 사용되는 용어이나 약간 다른 의미를 가지고 있다.
  • Authority는 사용자가 수행할 수 있는 구체적인 작업을 나타내는 데 사용 ex) 읽기, 쓰기, 수정
  • Role은 사용자의 역할을 나타내며, 보통 한 사용자에게 여러 권한을 그룹화하는 데 사용 ex) 관리자는 읽기, 쓰기, 수정을 할 수 있다.
  • 기본 설정을 적용하면 Authority테이블만 생성하는데 Role 관련된 설정이 없다.
  • role은 반드시 prefix에 'ROLE'을 명시해야하는 작명규칙이 있다. role 관련설정은 스프링 시큐리티 4이상 버전부터 자동으로 접두사에 'ROLE'을 추가되니 주의할 것
  • 이들 모두 GrantedAuthority로 취급받기에 사람들이 같은 거라고 많이들 혼동하는 듯 하다.

참고자료

구조와 컴포넌트 등 공식문서 정리해주심
최범균님-전반적인구조(2014년
(2017년)레퍼런스 창고
스프링시큐리티 번역 정리
스프링시큐리티 이론 정리
스프링시큐리티에서 중요한 컴포넌트들
스프링 시큐리티의 아키텍처(구조) 및 흐름
스프링 시큐리티 기본 API및 Filter 이해
공식문서를 기반으로 스프링 시큐리티(Spring Security) 기본 개념과 구조 파악

0개의 댓글