Section 4 [Spring Security] Spring Security 기본

챠오·2023년 1월 16일
0

코드스테이츠

목록 보기
4/7

Spring Security란?

만약 고객들이 사용하는 실제 어플리케이션이 보안을 전혀 고려하지 않은 상태로 오픈되었다고 가정해보자.

해당 경우 어떤 문제점들이 발생할까.


로그인 기능(인증, Authentication)이 없음

로그인 기능이 없다면 어떤 문제가 발생할 수 있을까?

자신을 증명할 방법이 없기 때문에 다른 사람이 회원으로 등록한 내 정보 또는 내가 주문한 주문 정보 등에 대해서 애플리케이션의 API를 호출해서 얼마든지 조회가 가능하게 된다는 문제점이 발생한다.

한마디로 애플리케이션의 상태가 우리 집 대문에 자물쇠를 채우지 않은 상태로 활짝 열어놓은거나 마찬가지의 상태가 되는 것이다.

이 상태로는 다른 사람의 개인정보를 탈취하는 것은 식은죽 먹기나 마찬가지일 것이다.


API에 대한 권한 부여(인가, Authorization) 기능이 없음

애플리케이션의 서비스를 사용하기 위한 적절한 인증 절차를 거쳤다하더라도 모든 리소스에 접근할 수 있는 것은 아니다.

예를 들어 단순히 커피를 주문하는 회원의 경우 커피 목록에서 커피를 조회해서 주문하고자 하는 커피를 선택한 후, 주문을 할 것이다.

한 마디로 이 회원은 커피를 주문하는 손님인 것이다.

그런데 손님이 매장에서 판매하는 커피 정보를 마음대로 등록할 수 없어야하는데 API에 대한 접근 권한이 부여되지 않았다면 손님이 마음대로 커피 정보를 등록할 수 있다는 문제점이 발생한다.


웹 보안 취약점에 대한 대비가 전혀 이루어지지 않았음

웹 애플리케이션을 위협하는 세션 고정 공격, 클릭재킹 공격, CSRF 등의 보안 취약점에 대한 고려가 전혀 이루어지지 않은 상태라면 Spring Security라는 보안 프레임워크를 이용해서 보안상의 취약점들을 보완해야 한다.


Spring Security란?

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

물론 Spring에서 지원하는 Interceptor나 Servlet Filter를 이용해서 보안 기능을 직접 구현할 수 있지만 웹 애플리케이션 보안을 대부분의 기능을 Spring Security에서 안정적으로 지원하고 있기 때문에 구조적으로 잘 만들어진 검증된 Spring Security를 이용하는 것이 안전한 선택이라고 볼 수 있다.


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

Spring Security를 애플리케이션에 적용하면 다음과 같은 일들을 할 수 있다.

  • 다양한 유형(폼 로그인 인증, 토큰 기반 인증, OAuth 2 기반 인증, LDAP 인증)의 사용자 인증 기능 적용

  • 애플리케이션 사용자의 역할(Role)에 따른 권한 레벨 적용

  • 애플리케이션에서 제공하는 리소스에 대한 접근 제어

  • 민감한 정보에 대한 데이터 암호화

  • SSL 적용

  • 일반적으로 알려진 웹 보안 공격 차단

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


Spring Security에서 사용하는 용어 정리

Spring Security를 적용하기 위해서는 보안 영역에서 일반적으로 사용하는 개념들을 자주 접하게 될 것이다.

따라서 이러한 개념들을 사전에 이해하고 있다면 Spring Security의 기능을 조금 더 쉽게 이해하고 적용할 수 있다.

Principal(주체)

Spring Security에서 사용되는 Principal은 애플리케이션에서 작업을 수행할 수 있는 사용자, 디바이스 또는 시스템 등이 될 수 있으며, 일반적으로 인증 프로세스가 성공적으로 수행된 사용자의 계정 정보를 의미한다.

Authentication(인증)

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

Authentication을 정상적으로 수행하기 위해서는 사용자를 식별하기 위한 정보가 필요한데 이를 Credential(신원 증명 정보)이라고 한다.

예를 들어 주민센터에 방문해서 주민등록등본을 발급받는다고 가정해보자. 주민센터 직원이 신원을 확인하기 위해 요청하는 주민등록증이 바로 Credential이 될 수 있다.

특정 사이트에서 로그인을 위해 입력하는 패스워드 역시 로그인 아이디를 증명하기 위한 Credential이 된다.

Authorization(인가 또는 권한 부여)

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

Authorization은 반드시 Authentication 과정 이후 수행되어야 하며 권한은 일반적으로 역할(Role) 형태로 부여된다.

Access Control(접근 제어)

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


핵심 포인트

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

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

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

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

  • Credential(신원 증명 정보)은 Authentication을 정상적으로 수행하기 위해서는 사용자를 식별하기 위한 정보를 의미한다.

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


Spring Security를 사용해야 하는 이유

보안이 더 어려울까?, Spring Security를 사용하는 것이 더 어려울까?

Spring Security를 사용해야 하는 이유에 대해서 간단하게 짚고 넘어가 보자. Spring Security를 사용해 본 사람들이 항상 하는 이야기는 ‘어렵다’이다.

그럼 Spring Security가 어렵게 느껴지는 가장 큰 이유는 무엇일까?

바로 보안이라는 주제 자체가 소프트웨어 세계에서 가장 어려운 주제 중 하나이기 때문이다.

그렇다면 Spring Security를 사용하는 것이 어려울까요, 아니면 그 어려운 보안을 강화하기 위해 밑바닥부터 모두 설계하고 구현하는 것이 어려울까?

Spring Security를 사용해야 하는 이유

그런데 애플리케이션의 보안을 강화하기 위해 왜 굳이 Spring Security를 사용해야 할까?

결론부터 이야기 하자면 애플리케이션의 보안을 강화하기 위한 솔루션으로 Spring Security만한 다른 프레임워크가 존재하지 않기 때문이다. ^^

물론 Apache Shiro, OACC 같은 Java 애플리케이션을 위한 보안 프레임워크가 존재하지만 Spring Security는 다른 보안 프레임워크가 제공하는 기능들을 모두 아우르는 기능을 지원하고 있으며, 또한 Spring 기반의 애플리케이션을 구현하는 개발자 입장에서는 Spring과 궁합이 가장 잘 맞는 Spring Security를 사용하는 것은 자연스러운 일이라고 볼 수 있다.

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

그런데 때로는 기본 옵션으로 만족시킬 수 없는 특정 보안 요구 사항을 만족시켜야 할 경우가 있는데, 이 경우 Spring Security를 사용하면 특정 보안 요구 사항을 만족시키기 위한 코드의 커스터마이징이 용이하고 유연한 확장이 가능하다.


핵심 포인트

  • 보안 기능을 밑바닥부터 직접 구현하는 것보다 잘 검증되어 신뢰할 만한 Spring Security를 사용하는 것이 더 나은 선택이다.

  • Spring Security는 특정 보안 요구 사항을 만족하기 위한 커스터마이징이 용이하고, 유연한 확장이 가능하다.

profile
무용한 헛소리들

0개의 댓글