프레임워크(Framework)/Spring

[Spring Security] 스프링 시큐리티란? - 기능, 용어, 사용하는 이유

잇트루 2022. 12. 25. 22:22
반응형

Intro

먼저, 실제 애플리케이션에서 보안을 고려하지 않은 상태에서 서비스를 하게 되면 여러 문제가 발생할 수 있다.

 

인증(Authentication) 수단이 없는 경우

사용자가 해당 서비스를 이용하는 사람이 나 자신임을 증명할 방법이 없다.

다른 사람이 얼마든지 나의 정보를 조회할 수 있으며, API 호출 등을 통해 서비스를 이용할 수 있게 된다.

따라서 사용자가 본인임을 증명할 수 있는 인증 수단이 필요하다.

  • ID와 PASSWORD와 같은 인증 정보를 사용해야 함

 

인가(Authorization) 기능이 없는 경우

사용자 인증 절차를 통과하더라도 모든 리소스에 접근할 수 있는 것은 아니다.

쇼핑몰을 예로 들면 판매자와 고객 등으로 구분할 수 있을 것이다.

판매자의 경우 상품을 등록하는 리소스를 이용할 수 있어야 할 것이며, 손님은 판매자가 등록한 상품을 주문할 수 있어야 할 것이다.

 

하지만, 인가가 제대로 이루어지지 않을 경우 고객은 판매자가 아님에도 불구하고 상품을 등록하고 수정하는 등의 판매자 리소스에 접근하는 일이 발생하게 된다.

따라서, 회원 구분에 따라 이용할 수 있는 리소스에 대한 접근 권한을 적절하게 부여해야 한다.

 

웹 보안 취약점에 대한 대비가 이루어지지 않는 경우

웹 애플리케이션의 특성상 여러 취약점이 존재한다.

만약, 웹 애플리케이션의 취약점에 대한 방어책을 구현하지 않을 경우 세션 고정 공격, 클랙재킹 공격, CSRF 등의 여러 수단의 공격으로 애플리케이션이 위험하게 될 수 있다.

 

 

Spring Security

스프링에서는 앞서 설명한 문제들을 해결하기 위해 보안 관련 프레임워크인 Spring Security를 제공하고 있다.

Spring Security는 Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization) 기능을 지원하는 보안 프레임워크이다.

스프링 시큐리티는 스프링 MVC 기반 애플리케이션에 보안을 적용하기 위한 사실상의 표준으로 자리 잡고 있다.

 

스프링에서 지원하는 Interceptor 또는 Servlet Filter 등을 이용해 보안 기능을 직접 구현할 수 있지만, 웹 애플리케이션 보안의 경우 대부분의 기능을 Spring Security에서 안정적으로 지원하고 있다.

따라서, 구조적으로 잘 만들어진 검증된 Spring Security를 이용하는 것이 안전한 선택이라고 볼 수 있다.

 

 

Spring Security의 기능

  1. 다양한 유형의 사용자 인증 기능 적용
    • 폼 로그인 인증, 토큰 기반 인증, OAuth 2 기반 인증, LDAP 인증 등
  2. 애플리케이션 사용자의 역할(Role)에 따른 권한 레벨 적용
  3. 애플리케이션에서 제공하는 리소스에 대한 접근 제어
  4. 민감한 정보에 대한 데이터 암호화
  5. SSL 적용
  6. 일반적으로 잘 알려진 웹 보안 공격에 대한 차단

 

이 외에도 SSO, 클라이언트 인증서 기반의 인증, 메서드 보안, 접근 제어 목록(Access Control List) 등과 같은 보안을 위한 대부분의 기능을 지원하고 있다.

 

 

Spring Security 용어

Principal(주체)

Principal은 애플리케이션에서 작업을 수행할 수 있는 사용자, 디바이스 또는 시스템 등이 될 수 있다.

일반적으로 인증 프로세스가 성공적으로 수행된 사용자의 계정 정보를 의미한다.

 

Authentication(인증)

Authentication은 애플리케이션을 사용하는 사용자가 본인이 맞음을 증명하는 절차를 의미한다.

Authentication을 정상적으로 수행하기 위해서는 사용자를 식별하기 위한 정보가 필요하다.

  • Credential : 사용자를 식별하기 위한 정보(신원 증명 정보)
  • 실생활에서의 Credential은 주민등록증, 운전면허 등이 있다.
  • 웹 사이트에서의 Credential은 로그인을 위해 입력하는 패스워드 등이 있다.

 

Authorization(인가 또는 권한 부여)

Authorization은 인증(Authentication)이 정상적으로 수행된 사용자에게 특정 권한(authority)을 부여하는 것을 의미한다.

특정 권한을 부여받은 사용자는 애플리케이션의 특정 리소스에 접근할 수 있게 된다.

 

따라서, 인가(Authorization)는 반드시 인증(Authentication) 과정이 정상적으로 수행된 이후에 이루어져야 한다.

특정 권한들은 역할(Role) 형태로 부여되는 것이 일반적이다.

 

Access Control(접근 제어)

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

 

 

Spring Security를 사용해야 하는 이유

보안 강화를 위한 솔루션을 개발하는 것은 매우 어렵다.

Spring에서 제공하는 여러 모듈 중에서도 Spring Security는 어려운 난이도에 속한다.

하지만, 보안에 대한 여러 취약점들을 직접 설계하고 구현하는 것은 더욱 어렵기 때문에 안정성에서 이미 증명되어 있고 비교적 쉽게 사용할 수 있는 Spring Security를 사용하는 것이 현명한 판단이 될 것이다.

 

Spring Security를 대체할 만한 다른 프레임워크가 존재하지 않는다.

Java 애플리케이션을 위한 보안 프레임워크인 Apache Shiro, OACC 등과 같은 프레임워크가 존재한다.

하지만, Spring Security는 다른 보안 프레임워크가 제공하는 기능들을 모두 지원하고 있다.

또한, Spring 기반의 애플리케이션을 개발하는 입장에서는 Spring과 구조적으로 잘 맞는 Spring Security를 사용하는 것은 자연스러운 일이다.

 

커스터 마이징이 용이하고 유연한 확장이 가능하다.

Spring Security에서 지원하는 기본 옵션을 통해 대부분의 보안 요구 사항을 만족시킬 수 있는 장점이 있다.

하지만 기본 옵션으로 만족시킬 수 없는 특정 보안 요구사항이 생길 경우에도 이러한 요구사항을 만족시키기 위한 코드의 커스터 마이징이 용이하고 유연한 확장을 가능한 것이 Spring Security이다.

반응형