Spring/Spring Security

[Spring Security] Spring Security란? (feat.학습 이유)

공대키메라 2022. 7. 15. 17:24
필자 키메라는 Spring Security를 이번에 제대로 공부하고자 한다. 

내 생각에는 모든 길에는 역시 정공법으로 접근해야한다는 생각이 든다(갑자기...?)

특히, 이 개발이라는것이 결국에는 누군가가 잘 만들어놓은 기능을 가져다가 사용하는 경우가 부지기수다.

과거 (아니 벌써 1년이 넘었네...) 개발원에서 최종 프로젝트 당시 부랴부랴 spring security를 적용했고, 

혼자 미니 프로젝트 만들어보겠다고 공부하면서, 강의 배껴가면서 하던게 얼마전 같이 느껴진다. 

하지만 단기 속성으로 하게되면 결국에는 남는게 없었다.

내가 스스로 학습하고, 적용하고, 이해하지 않으면 그 많은 강의도, 시간 투자도 소용이 없다는것을 깨달았기에...

최근에 React공부를 하듯이 직접 프로젝트를 생성하고, 적용하고 흐름을 이해해 보기로 결심했다.!

진짜 spring security를 다시금 제대로 이해하고 다시 넘어가도록 하겠다.

얄팍한 수로(?) 강의만 들으면 내것이 될것이라는 기대감이 있었지만... 그래서 이해했다고는 설명하지 못하겠다.

아마 공식 문서를 읽어보려면 오랜 시간이 걸리겟지만... 어쩔수 없다!

모든 글은 공식 사이트를 기준으로 공부해나갈 것이다. 되도록... 

 

이 글에서 Spring Security란 무엇이고, Spring Security을 사용하기 전에 알아야 하는 개념에 대해서 집고 넘어갈 것이다.

 

참고로 사이트의 내용을 대부분 번역해서 정리한 것이지만, 필요없다고 생각되는 부분은 과감하게 지우고 Gradle을 기준으로만 정리하고 테스트할 계획이다. (maven 싫어...)

 

참고한 사이트는 다음과 같다. 

 

출처:

https://docs.spring.io/spring-security/reference/index.html

https://www.javadevjournal.com/spring/what-is-spring-security/

https://docs.spring.io/spring-security/reference/modules.html

 

1. Spring Security란? 

Spring Security는 인증과 인가, 그리고 흔한 공격들에 대한 보호를 간단한 servlet 필터들을 사용해 제공하는 프레임워크다. 

중요한 반응하는 애플리케이션을 둘 다 보호하는 것을 지원하는 Spring Security는 스프링 기반 애플리케이션을 보호하기 위한 사실상의 표준이다. 

 

사실 보안처리 경우 spring은 Spring Security가 빠지지 않고 모든 프로젝트에 들어가긴 한다. 

 

spring securiry는 다음 핵심 개념을 지원한다.

  • 인증(Authentication)
  • 인가(Authorization)
  • 비밀번호 저장(Password storage)
  • 서블릿 필터(Servlet Filter)

1-1 인증(Authentication)

당신이 누구인지 증명하기 위해 유효한 자격을 받아서 어플리케이션을 사용하고 있는지를 확인하기 위해 사용된다.

인증은 신원의 원칙을 만든다.

 

1-2 인가(Authorization)

인가는 인증의 외이다 (그러니까 다른 것이라고 말하는것 같다). 간단한 어플리케이션을 위해, 유저 인증은 충분할 지 몰라도, 큰 기업용 에플리케이션에 대해 생각해보자. 

  • 일반 직원 (예를 들어 콜센터 직원)이 특정한 작업을 하기 위해 오직 제한된 허가를 가지고 있을 수 있다. 우리는 다른 작업을 그 직원이 하는것을 허용하길 원하지 않는다. 
  • 우리 백엔드 상품 매니저는 상품에서만 작업하는것을 허락한다. 우리는 직원 정보나 주문 정보를 상품 매니저가 바꾸는걸 허용하질 원하지 않는다. 
  • 전자상거래 매니저가 고객과 주문 정보에 관해 업무를 할 수 있지만, 상품 정보는 변경할 수 없다.
  • 시스템 관리자는 모든 작업을 수행할 수 있다. 

간단한 인증으로 우리는 사용자 특권 혹은 허가에 대한 정보가 없을 때 사용자를 제한할 수 없다. 

인가는 유저가 자원에 접근하려 하기 전에 이러한 정보를 제공해준다. 

 

이것은 접근 제어의 과정이고, 그 원칙이 액션을 수행하는것을 허용하는지 아닌지를 결정하는 과정이다. 

 

1-3 비밀번호 저장(Password Storage)

우리의 비밀번호가 안정하고 해킹하기 어렵다는걸 확인하는것은 모든 보안 프레임워크의 또다른 주요한 목표다. Spring Security의 PasswordEncoder interface는 비밀번호를 한방향으로 변환하는 작업을 수행한다. (비밀번호를 decrypt할 수는 없다.) Spring Security는 몇가지 PasswordEncoder를 제공한다. 

 

  1. BCryptPasswordEncoder
  2. Argon2PasswordEncoder
  3. Pbkdf2PasswordEncoder
  4. SCryptPasswordEncoder

1.4 서블릿 필터(Servlet Filters)

Spring security는 우리 웹 애플리케이션의 보안 체크를 시작하기 위해 자바 서블릿 필터를 사용한다.

 

여기서 필터에 대해 좀 더 알고 싶다면 필자가 전에 공부하면서 정리한 내용이 있다. (궁금하면 여기 클릭!)

2. 스프링 시큐리티의 장점(Advantages of Spring security)

여기 스프링 시큐리티를 사용하는 몇가지 중요한 점이 있다. 

  • Servlet API 통합
  • 인증과 인가 둘 다 지원을 확장 가능
  • 세션 수정, 클릭 jacking같은 공격 보호
  • Spring MVC 통합
  • brute force attack에서 어플리케이션을 보호할 능력
  • portability (이식성)
  • CSRF 공격 보호
  • 자바 configuration 지원

3. 스프링 시큐리티 모듈(Spring Security modules)

스프링 시큐리티에서, 시큐리티 모듈은 그 기능을 바탕으로 몇개의 jar 파일들로 구성된다.

 

주요한 사용은 사용자가 요구사항에 따라서 통합을 하게 해준다.

 

메이븐(maven) 프로젝트에서 최소한의 스프링 시큐리티를 포함하려면 아래 사항을 pom.xml에 포함하면 된다. 

 

  • Core – spring-security-core.jar–This module contains core authentication and access-control related classes, basic provisioning APIs. This is mandatory for providing spring security to any J2EE based enterprise application. This module supports non-web applications, too.
  • Web – spring-security-web.jar–This module contains filters and web-based authentication, like access control for URLs in a Servlet environment. This module is responsible to provide security to your Spring MVC or any other web application.
  • Config- spring-security-config.jar–This module used to use the Spring Security XML name-space. It also supports.
  • LDAP – Modules supporting the LDAP authentication. We may need this if you want to have LDAP authentication for our application.
  • OAuth 2.0 Core – Provides support for the OAuth 2.0 authorization.
  • OAuth 2.0 Client – Spring Security’s client support for OAuth 2.0 Authorization Framework and OpenID Connect Core 1.0.

4.  스프링 시큐리티 인증 구조(Spring Security Authentication Architecture)

https://www.javadevjournal.com/wp-content/uploads/2019/09/Spring-Security-Architecture--1024x607.png.webp

5. 프로젝트 모듈과 의존성(Project Modules and Dependencies)

공식 사이트에서는 다른 모듈들과의 의존송을 위해 maven을 사용하기를 권장한다. 

 

물론 gradle을 쓰는게 편하긴 하지만 이번에는 학습을 위해 maven을 사용하도록 하겠다.

 

스프링 시큐리티에는 여러 모듈이 있다. 어떤 모듈이 있는지 한 번 확인해보자. 

 

Core - spring-security-core.jar

이 Core 모듈은 core 인증과 접근 제어 클래스 그리고 인터페이스, remoting support, 그리고, 기본 제공 API를 포함한다. 

 

이 모듈은 스프링 시큐리티를 사용하는 모든 어플리케이션에서 요구된다. standalone 어플리케이션, remote clients, service layer의 method security, jdbc 유저 provisioning을 지원한다.

 

포함하고 있는 package 목록

  • org.springframework.security.core
  • org.springframework.security.access
  • org.springframework.security.authentication
  • org.springframework.security.provisioning

 

Remoting - spring-security-remoting.jar

이 remoting 모듈은 Spring Remoting 과 통합기능을 제공한다. Spring remote를 사용하는 remote client가 없다면 필요하지 않다. 

 

main package는 org.springframework.security.remoting이다. 

 

Web - spring-security-web.jar

이 Web 모듈은 filter를 포함하고 web-security intrastructure 코드와 연괸있다. servlet API 의존을 모두 포함한다. 

 

Spring Security web 인증 서비스와 URL 기반의 접근 제어가 필요하다면, 이게 필요할 것이다. 

 

main package는 org.springframework.security.web이다.

 

이 외에도 Config, LDAP, OAuth 2.0 등등 정말 많은 모듈을 제공한다. 

 

한 번 읽어보길 권장한다. (여기 클릭)

5. 스프링 시큐리티 프로젝트 생성

 

필자는 간단하게 thymeleaf 로 테스트 하기 위해 spring initializr를 사용하려 했으나... 

 

해당 사이트의  Servlet Applications > Getting started 항목에서의 예시를 제공하고 있기 때문에 다음 주소에서 프로젝트를 다운받았다.  (여기 클릭)

 

사이트에서 제공하는 예시 프로젝트를 다운받으면 java 17 버전을 기준으로 제공하기 때문에 jdk 11로 필자는 버전을 우선 낮췄다.

 

다운 후 실행한 모습

6. Spring Boot Auto Configuration

Spring boot는 자동적으로...

 

  • Spring Security의 기본 설정을 사용할 수 있게 하고, springSecurityFilterChainn 이라는 빈으로 servlet filter를 생성한다. (filter 자체를 빈으로 등록해버리다니... 재미있네!)
  • 사용자의 username을 가진 UserDetailService 빈을 생성하고 무작위로 콘솔창에 기록된 password를 생성한다. 
  • 모든 요청마다 Servler container를 가진 springSecurityFilterChain이라는 빈으로 Filter 를 등록한다. 

 

Spring Boot는 설정이 많이 하지 않지만, 하는게 많다. 

 

생략.... (딥따 많아 ^^)


이번 시간에는 공식 사이트를 따라 spring의 전반적인 지원 기능을 알아보았고, 제공하는 실습용 프로젝트를 다운받았다. 

 

다음섹션부터 또 이어서 공부를 진행하도록 하겠다.