[Spring] Spring Security 개요

[Spring] Spring Security 개요

#목차

Spring Security 개요

  • 해당 포스트에서는 Spring Security의 핵심적인 인증(Authentication), 인가(Authorization), 보안과 관련된 개념을 다룬다.

Spring Security 란?

Spring Security는 Java 웹 어플리케이션의 인증인가(권한 부여) 를 제공하며, 웹 공격에 대한 방어 기능을 제공 해주는 스프링의 하위 프레임워크이다. - spring.io

인증과 권한(인가)이란?

  • 인증과 권한(인가)에 대한 자세한 내용은 아래 링크를 통해 확인 할 수 있다.

Continue with [Security] 인증과 인가

간단히 인증과 인가(권한 부여)에 대한 뜻을 알아보자.

  • 인증 - Authentication
    • (지문 또는 얼굴 등) 입증 가능한 정보로 사용자의 신원을 확인하는 과정이다.
    • 즉, 식별 가능한 정보로 서비스에 등록된 유저의 신원을 입증하는 과정
  • 인가(권한 부여) - Authorization
    • 입증(인증) 된 신원권한에 대한 허가를 나타내는 것이 인가이다.
    • 즉, 인증된 사용자에 대한 특정 리소스에 접근할 권한이 있는지 확인하는 과정

간단한 표로 인증과 인가의 차이를 알아보자.

-인증(Authentication)인가(Authorization)
기능사용자에 대한 자격 증명 확인사용자에 대한 권한 부여 또는 거부
작동비밀번호, 생체 인식, 일회용 핀 또는 앱을 통해 작동개발,보안팀에서 관리하는 설정을 통해
데이터 이동ID 토큰을 통해 데이터 이동액세스 토큰(Access Token)을 통해 데이터 이동

Spring Security에서의 인증, 인가 그리고 보호의 기능

인증(Authentication)

  • 스프링 시큐리티의 인증은 양식((e.g)로그인 양식) 기반 인증, HTTP 기본 인증, 세션 기반 인증, JWT(Json Web Token) 기반 인증, OAuth 2.0, OpenID Connect 등을 비롯한 다양한 인증 메커니즘을 제공한다.

인가(권한 부여(Authorization))

  • 스프링 시큐리티의 인가는 애플리케이션에서 어떤 사용자가 특정 리소스에 액세스(접근) 할 수 있는지 세밀 하게 제어할 수 있다.
  • 이는 역할 기반 액세스 제어(RBAC), 표현식 기반 액세스 제어(EL 기반) 와 같은 다양한 기술을 사용하여 수행할 수 있다.

웹 공격으로부터의 보호

  • 사이트 간 스크립팅(XSS), 사이트 간 요청 위조(CSRF), 세션 고정과 같은 웹 사이트 공격에 대한 기본 보호 기능을 제공한다.

Spring Security의 핵심 역할

인증(Authentication) : 사용자의 신원을 확인하는 프로세스

  • 양식((e.g)로그인 양식) 기반 인증
    • 가장 일반적인 인증 유형으로, 사용자가 로그인 양식에 사용자 이름(username)과 비밀번호(password)를 입력하는 방식이다.
  • HTTP 기본 인증
    • 이 인증 유형은 사용자가 모든 요청(Request)HTTP 헤더에 자격 증명을 제공해야 한다.
    • 웹 서버와 클라이언트 간의 간단한 인증 방식이며, 이 방식은 HTTP 프로토콜내장된 메커니즘으로, 사용자 이름과 비밀번호를 Base64로 인코딩한 후 HTTP 헤더에 추가하여 서버에 전송하게된다.
  • OAuth 2.0
    • OAuth 2.0은 인증에 널리 사용되는 개방형 표준이다.
    • Spring Security는 OAuth 2.0을 지원하므로 애플리케이션을 다른 OAuth 2.0 호환 시스템과 쉽게 통합할 수 있다.
      • e.g) Google, Naver, Kakao 로그인 등등…

Continue with [Security] OAuth 2.0

  • OpenID Connect
    • OpenID ConnectOAuth 2.0를 기반으로 구축된 ID 계층이다.
    • 사용자 프로필 정보 및 싱글 사인온(SSO)과 같은 추가 기능을 제공한다.

      SSO(Single Sign On) 이란?
      한 번의 로그인으로 여러 가지 다른 사이트들을 자동적으로 접속하여 이용하는 방법을 말한다.

Continue with [Security] OpenID Connect

인가(권한 부여(Authorization)): 사용자가 특정 리소스에 액세스(접근)할 수 있는지 여부를 결정하는 프로세스

  • 역할 기반 액세스 제어(RBAC(Role-Based Access Control))
    • 사용자의 역할에 따라 시스템 리소스에 대한 접근을 제어하는 방식이며, 이는 사용자가 아닌 “역할”에 권한을 부여 하고, 사용자는 해당 역할을 통해 권한을 얻게 된다.
    • 예를 들어, ‘관리자’, ‘사용자’, ‘게스트’ 등의 역할미리 정의하고, 이 역할에 따라 특정 리소스에 대한 접근 권한을 부여한다.
    • RBAC는 간단하고 이해하기 쉬운 모델로, 대부분의 시스템에서 널리 사용되고 있습니다.
  • 표현식 기반 액세스 제어(EL(Expression Language) 기반)
    • EL 기반 액세스 제어보안 결정을 위해 보안 표현식을 사용하는 방식이다.
    • 이는 사용자의 역할, 액세스하려는 리소스, 애플리케이션의 현재 상태와 같은 여러 요소에 따라 달라지는 권한 부여 규칙을 구현하는 데 유용할 수 있다.
    • 또한, 사용자의 역할 뿐만 아니라 다양한 조건(로그인 상태, IP 주소, 시간 등)을 사용하여 접근 권한을 판단한다.
    • 예를 들어, .hasRole('ROLE_ADMIN')이나 .hasIpAddress('192.168.1.0/24')와 같은 표현식을 사용할 수 있다.

웹 공격으로부터의 보호

Spring Security는 다양한 웹 공격으로부터 애플리케이션을 보호한다.

  • CSRF(Cross-Site Request Forgery) 공격 방어
    • CSRF(Cross-Site Request Forgery)사용자가 자신의 의지와는 무관하게 공격자가 의도한 행동을 하도록 만드는 공격이다.
    • 스프링 시큐리티CSRF 토큰을 사용하여 이러한 공격을 방어하게 되는데, 기능적으로 보면 CSRF 토큰서버에서 생성하여 클라이언트에게 전달하고, 클라이언트는 이후 요청에 이 토큰을 포함하여 서버로 전송한다.
    • 서버는 이 토큰을 검증하여 유효한 요청인지를 판단한다.
  • 세션 고정(Session Fixation) 공격 방어
    • 세션 고정 공격공격자가 특정 세션 ID를 미리 알아내고 이를 이용하여 다른 사용자의 세션을 탈취하려는 공격이다.
    • 스프링 시큐리티로그인 시 새로운 세션을 생성하여 이전 세션의 정보를 새 세션으로 복사하는 방식으로 세션 고정 공격을 방어한다.
  • 클릭재킹(Clickjacking) 방어
    • 클릭재킹사용자가 의도한 곳이 아니라 다른 곳을 클릭하도록 만드는 공격이다.
    • 스프링 시큐리티X-Frame-Options 헤더 를 이용하여 이러한 공격을 방어한다.
    • 이 헤더를 통해 브라우저는 현재 페이지가 iframe 내에서 렌더링되는 것을 방지할 수 있다.

      iframe이란?
      현재 HTML 페이지 안에 다른 HTML 페이지를 포함시키는 중첩된 브라우저이다.
      iframe 요소를 이용하면 해당 웹 페이지 안에 어떠한 제한 없이 다른 페이지를 불러와서 삽입 할 수 있다.

  • XSS(Cross-Site Scripting) 방어
    • XSS(Cross-Site Scripting)공격자가 웹 페이지에 악성 스크립트를 삽입하여 다른 사용자의 데이터를 탈취하거나 조작하는 공격이다.
    • 스프링 시큐리티사용자의 입력을 필터링하거나 이스케이프하여 이러한 공격을 방어한다.

      이스케이프 처리란?
      & => &amp;, ' => &#x27;, " => &quot;, < => &lt;, > => &gt;, / => &#x2F;
      즉, 코드로써 작성될 수 있는 기호들을 이스케이프 처리한 텍스트로 작성하는 것이다.

  • SQL Injection 방지
    • SQL 인젝션공격자가 애플리케이션의 입력값을 조작하여 의도치 않은 SQL 쿼리를 실행하는 공격이다.
    • 스프링 시큐리티 자체는 SQL 인젝션을 방지하는 기능을 제공하지 않지만, 스프링 프레임워크의 일부인 JdbcTemplate 또는 JPA, Hibernate와 같은 ORM(Object Relational Mapping) 도구를 사용하면 SQL 인젝션을 방지할 수 있다.
    • 이들 도구는 파라미터 바인딩을 통해 쿼리를 안전하게 만들어 준다.

      파라미터 바인딩이란?

      • 이름 기반 바인딩 : =:연산자를 사용, 메서드 체이닝을 사용
        Query query = em.createQuery("select m from Member m where m.username =: username").setParameter("username", userName);    
        
      • 위치 기반 바인딩 : =?연산자를 사용, 메서드 체이닝을 사용
        Query query = em.createQuery("select m from Member m where m.username =? 1").setParameter(1, userName);    
        
  • 권한 우회 공격 방어
    • 권한 우회 공격공격자가 본인의 권한 이외의 리소스에 접근하려는 시도이다.
    • 스프링 시큐리티URL 레벨이나 메소드 레벨에서 접근 제어를 설정하여 이러한 공격을 방어할 수 있다.
    • 예를 들어, 특정 URL은 관리자 권한을 가진 사용자만 접근할 수 있도록 설정할 수 있다.
    • 또한, 표현식 기반 EL(Expression Language)의 접근 제어를 통해 더욱 세밀한 권한 설정이 가능하다.

정리

스프링 시큐리티는 이런 방식으로 인증, 인가 과정을 관리하고, 애플리케이션을 다양한 웹 공격으로부터 보호한다. 이를 통해 개발자는 보안과 관련된 부분에 대해 신경 쓰지 않고, 비즈니스 로직에 집중할 수 있게 해준다.

Reference