[Spring Boot] Spring Security API와 Filter의 기본 이해 및 설정

Ogu·2023년 7월 3일
0

SpringSecurity

목록 보기
3/3

Spring Security는 애플리케이션의 인증, 인가 등의 보안 기능을 제공하는 스프링 프레임워크입니다.
우선 자주 사용되는 용어부터 이해해 보도록 합시다.

보안 용어의 이해

인증(Authentication)과 인가(Authorization)

인증(Authentication)

인증(Authentication)은 사용자가 누구 인지 확인하는 단계를 의미합니다. 대표적인 예로 로그인이 있습니다. 로그인은 데이터베이스에 등록된 아이디와 패스워드를 사용자가 입력한 로그인 정보와 비교해 일치하는지 확인합니다. 만약 로그인에 성공하면, 서버는 response로 토큰(token)을 전달하고, 만약 전달받지 못했다면 접근이 불가능합니다.

인가(Authorization)

인가(Authorization)는 인증을 통해 검증된 사용자가 애플리케이션 내부의 리소스에 접근할 때 사용자가 해당 리소스에 접근할 권리가 있는지를 확인하는 과정입니다. 예를 들어, 게시판 커뮤니티의 글 열람이나 작성을 할때 등급을 통한 접근 허가가 있습니다. 앞서 인증을 통해 부여받은 토큰에는 대게 인가 내용을 포함합니다.

스프링 시큐리티

스프링 시큐리티의 동작 구조

필터(Filter)란?


스프링 시큐리티는 스블릿 필터(Servlet Filter)를 기반으로 동작합니다.
필터체인(FilterChanin)은 서블릿 컨테이너에서 관리하는 ApplicationFilterChain을 의미합니다. 클라이언트에서 애플리케이션으로 요청을 보내면 서블릿 컨테이너는 URI를 확인해 필터와 서블릿을 매핑합니다. 스프링 시큐리티는 사용하고자 하는 필터체인을 서블릿 컨테이너의 필터 사이에서 동작시키기 위해 아래와 같이 DelegatingFilterProxy를 사용합니다.

DelegatingFilterProxy는 서블릿 컨테이너의 생명주기와 스프링 애플리케이션 컨텍스트 사이에서 다리 역할을 수행하는 필터 구현체입니다. FilterChainProxy를 내부에 가지고 있으며 이는 스프링 부트의 설정에 의해 자동 생성됩니다.

UsernamePasswordAuthenticationFilter

실습

Spring Security 의존성 추가

build.gradle에 다음과 같이 dependency를 추가합니다.

implementation 'org.springframework.boot:spring-boot-starter-security'

의존성을 추가한 후 다시 build.gradle을 로드하고 localhost:8080에 접속하면 다음과 같은 기본 로그인 창이 나타납니다.

기본적으로 스프링 시큐리티는 인증되지 않은 서비스를 사용할 수 없게끔 되어 있습니다. 그러나 우리는 개발에 있어 테스트 환경이 중요하기 때문에 시큐리티 설정을 로그인 없이도 접근할 수 있도록 바꿔주도록 합시다.

SecurityConfig.java 설정 클래스 생성

config 패키지 아래 SecurityConfig.java 설정 클래스 생성하여 아래와 같이 작성합니다.
어노테이션은 설정 파일임을 알리는 메타 데이터 어노테이션 @Configuration과 모든 요청 URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션 @EnableWebSecurity를 추가합니다. WebSecurityConfigurerAdapter를 상속받는 config 설정 객체에 @EnableWebSecurity 어노테이션을 달면 SpringSecurityFilterChain에 등록됩니다.

package com.likelion.likelion230626;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import java.security.Security;

@Configuration
@EnableWebSecurity
public class SecurityConfig {  // 내부적으로 SpringSecurityFilterChain이 동작해 URL 필터가 적용됨
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests()  // 인증, 인가 설정 시작
        	.requestMatchers(new AntPathRequestMatcher("/**")) // 특정 요청과 일치하는 url애대한 액세스 설정
            .permitAll() // requetMatchers 설정한 리소스의 접근을 인증 절차 없이 허용
        ;
        return http.build();
    }
}

💊 .anyRequest().authenticated();
-> anyRequest() : 위에서 설정한 url 이외의 요청에 대한 설정
-> 어떤 요청이든 authentication(인가) 과정을 거치도록 힘.

다시 스프링부트를 동작시키면 Whitelabel Error Page가 나타납니다.

Spring Security Dependency 추가시 일어나는 일들

Spring Security Dependency를 한 후 서버가 기동되면 스프링 시큐리티의 초기화 작업 및 보안 작업이 이루어집니다. 별도의 설정을 하지 않아도 기본적인 웹 보안 기능이 제공됩니다.

  • 모든 요청은 인증이 되어야 자원에 접근이 가능 (초기 설정)
  • 인증 방식으로 폼 로그인 방식과 httpBasic 로그인 방식 제공
  • 기본 로그인 페이지 제공
  • 기본 계정 한 개 제공 (user , random 문자열 암호값)

💊 HTTP basic 인증과 Form 인증의 차이
https://www.inflearn.com/questions/250472/http-basic-%EC%9D%B8%EC%A6%9D%EA%B3%BC-form-%EC%9D%B8%EC%A6%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4

매번 랜덤으로 생성되는 암호값으로 로그인 하는것은 개발에 있어 까다로울 것입니다.
application.propertiess에 다음과 같이 name과 password를 설정할 수 있습니다.

spring.security.user.name=user
spring.security.user.password=1234

하지만 이렇게 설정할 경우, 계정 및 권한 추가와 DB 연동 등이 복잡합니다.
기본적인 security기능 외에 각 서비스에 맞는 세부적이고 추가적인 보안 설정이 필요할 것입니다.
따라서 인증, 인가 API를 구현한 사용자 정의 보안 기능을 구현해야 합니다.

참고

profile
私はゲームと日本が好きなBackend Developer志望生のOguです🐤🐤

0개의 댓글