2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

1장 자바 스프링 시큐리티 구성 및 의존성 추가 기능들

2023. 12. 24. 18:54ㆍ스프링 시큐리티 -세션/Chatper01 스프링 시큐리티 전반적인 기능

 

 

스프링 시큐리티란?

 

 

스프링 시큐리티는 자바 스프링에서 제공하는 보안 라이브러리이다.

 

스프링 시큐리티 라이브러리를 추가함과 동시에 스프링에서는 어떤 자원(URL)경로를 들어가면

스프링 시큐리티가 작동한다.

 

 

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

 

이렇게 스프링 시큐리티 라이브러리를 추가 하면

이제부터 스프링에서 관리하는 모든 자원은 시큐리티의 인증인가 없이는 들어갈 수 없다.

 

 

그렇다면 이제 시큐리티는 어떤식으로 사용해야할까?

 

일단은 자바 클래스파일 SecurityConfig를 만들어준다.

 

@Configuration
@EnableWebSecurity

 

그리고 클래스에 이 어노테이션을 추가해야 하는데

각각의 어노테이션이 무엇을 의미하는지 알아보자.

 

@Configuration

 

이 어노테이션은 스프링에서 이 설정파일들을 적용하겠다는 의미임으로 시큐리티관련된 설정들을 사용할때는

반드시 붙여야하는 어노테이션이다.

 

@EnableWebSecurity

 

이 어노테이션은 스프링 시큐리티에서 사용하는 설정파일 어노테이션이다.

 

기본적으로 몇가지 기능들을 제공하는데

 

1. 웹 보완 활성화

@EnableWebSecurity는 스프링 시큐리의 웹 보안 기능을 활성화 시킨다.

이는 스프링 애플리케이션에 보안 계층을 추가하여 웹 요청과 웹 인증기반을 처리할 것 이라는 것을 명시한다.

 

2.보안 구성 확장

 

이 어노테이션은 WebSecurityConfigurer 인터페이스를 구현하는 클래스에 사용된다.

개발자는 이 인터페이스를 구현하여 사용자 정의 보안 구성을 제공할 수 있다.

즉 URL에 대한 경로에 접근제어나 사용자 인증 방법,CSRF 보호 활성화등을 설정할 수 있다.

 

3.기본 보안 설정 대체

 

기본적으로 스프링 시큐리티는 기본적인 보안구성이 되어있다.

하지만 개발자가 이를 커스텀으로 제작해야할 때가 있다.

그럴경우 EnalbeWebSecuity를 사용하면 이러한 기본설정을 개발자가 바꿀 수 있다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
    
    
    SecurityFilterChain filterChain(HttpSecurity security){
        
    }
}

 

적용을 하면 이런식으로 클래스를 만드는데

스프링 시큐리티가 버전업이 되어서 이제는 오버라이딩해서 쓰는 것이 아닌

SecurityFilterChain클래스를 받아와서 객체를 생성해서 빈으로 등록해서 넣어주는 형태이다.

또한 이제 스프링 시큐리티는 기본적으로 람다 사용법으로 제공하고 있다.

 

 

package com.example.securitytest01.Config;


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.core.context.SecurityContextImpl;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

    @Bean
    SecurityFilterChain filterChain(HttpSecurity security) throws Exception {

        security.authorizeHttpRequests(request ->
                request.requestMatchers("/login").permitAll().anyRequest().authenticated());

        return security.build();
    }
}

 

 

기본적으로 위 설정과 같이 람다식으로 설정 할 수 있다.

하나하나 메서드를 보자면

 

.authorizeHttpRequests

 

url경로에 인증 방식을 정의하는 메서드이다

람다식을 사용해 개발자가 원하는대로 자원의 인증을 요구할 수 있다.

 

request.requestMatchers("/login").permitAll()

 

requestMachers은 어떤 url경로에 인증인가를 요구할 것인지 적어주면된다.

 

그리고 permtiAll()의 경우는 requestMachers에 적힌 경로는 인증인가를 풀어주겠다는 뜻이다.

 

즉 login의 경로는 인증인가를 받지 않겠다는 뜻이 된다.

 

requestMacher부분에는 여러가지 url경로를 설정할 수 있는데

request.requestMatchers("/login","/user/**").permitAll()

 

 

이렇게 user/**으로 적어준다면 user/ 경로가 들어간 모든 url은 인증인가를 받지 않고 자원을 보여주겠다는 의미가 된다.

 

.anyRequest().authenticated()

 

그 후 anyRequest()는 다른 모든 url경로는 authenticatd() 인증을 받겠다는 뜻이 된다.

즉 login경로와 /user 경로 외에는 모든 url경로는 인증인가를 받게 하겠다는 의미이다.

 

 

기본적으로 이런 스프링 시큐리티는 사진과 같은 흐름으로 동작하는데

여기서 WebSecuirtyConfigurerAdapter는 이제 없어지고 위에 처럼 SecurityFilterChain으로 사용되고 있다.

 

기본적으로 인증 API와 인가 API가 있으며 필요에 맞게 찾아서 사용하면된다.