스프링 시큐리티를 활용하여, 가장 먼저 인가 작업을 구현해보고자 한다.
🎈 인가
어느 자원에 대한 요청이 들어왔을 때, 요청한 대상이 해당 자원에 대한 접근 권한을 가졌는지 여부를 처리
인가 처리의 예를 들어보면 아래와 같다.
만약 인가 처리를 해준다면, 이러한 상황을 예방할 수 있다.
그럼 한번 스프링 시큐리티를 사용해 인가 작업을 처리해보자.
스프링 시큐리티의 인가 설정은 SecurityConfig 클래스 안에서 이루어진다. 먼저 해당 클래스를 만들어주자.
1. 메인 코드 디렉토리 안에 config
디렉토리 생성하기
2. 해당 디렉토리에 SecurityConfig
클래스 생성하기
3. SecurityConfig
클래스에 @Configuration
, @EnableWebSecurity
아노테이션 달아주기
@Configuration
: @Configuration
아노테이션을 달아주면, 해당 클래스 안에서 빈 객체(Bean)를 등록할 수 있고, 해당 빈은 싱글톤이 보장된다.@EnableWebSecurity
: @EnableWebSecurity
가 붙으면 스프링 시큐리티가 활성화된다. 또한 해당 아노테이션이 붙은 클래스 안에서 시큐리티와 관련된 설정을 할 수 있다.필터체인 메소드를 정의하는 방법은 다음과 같다.
SecurityFilterChain
타입을 반환하는 메소드를 생성한다.HttpSecurity
객체 변수를 매개변수로 받는다.@Bean
아노테이션을 붙여서, 메소드에서 반환되는 SecurityFilterChain
객체를 빈 객체로 등록한다.HttpSecurity
변수를 사용해 인가 처리에 관련된 설정을 진행한다.HttpSecurity.build()
메소드를 사용하여, 빌더 패턴으로 생성되는 필터 체인 객체를 반환한다.메소드의 예시 코드는 아래와 같다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
// 경로별 권한 설정
/**
* requestMatcher: 특정 경로에 대한 요청을 처리
* permitAll: 권한에 상관 없이 모든 요청 허용
* hasRole: 특정 역할이 있으면 접근 허용
* hasAnyRole: 특정 역할(여러개중 어느거나)이 있으면 접근 허용
* anyRequest: 그 외 모든 경로에 대하여 처리
* authenticated: 인증된 사용자만 접근 허용
* !!! 순서 주의. 위에서부터 제한적인 순으로!
*/
http.authorizeHttpRequests((auth)->{
auth
.requestMatchers("/", "/login", "/join", "/joinProc").permitAll()
.requestMatchers("/admin").hasRole("ADMIN")
.requestMatchers("/my/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated();
});
return http.build();
}
http.authorizeHttpRequests()
requestMatchers(권한 설정할 경로)
anyRequest()
permitAll()
authenticated()
hasRole(권한)
hasAnyRole(권한1, 권한2, ...)
hasRole()
과 유사함hasAnyRole()
는 여러개의 권한을 동시에 처리 가능SecurityConfig.java
package com.example.jwt.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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity // Spring Security 인가 활성화
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
// 경로별 권한 설정
/**
* requestMatcher: 특정 경로에 대한 요청을 처리
* permitAll: 권한에 상관 없이 모든 요청 허용
* hasRole: 특정 역할이 있으면 접근 허용
* hasAnyRole: 특정 역할(여러개중 어느거나)이 있으면 접근 허용
* anyRequest: 그 외 모든 경로에 대하여 처리
* authenticated: 인증된 사용자만 접근 허용
* !!! 순서 주의. 위에서부터 제한적인 순으로!
*/
http.authorizeHttpRequests((auth)->{
auth
.requestMatchers("/", "/login", "/join", "/joinProc").permitAll()
.requestMatchers("/admin").hasRole("ADMIN")
.requestMatchers("/my/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated();
});
}
정상적으로 페이지에 접근이 가능한 것을 확인할 수 있다.
해당 페이지에 대한 접근이 거부되며 403 Error
가 발생하는 것을 확인 가능
Reference