본문 바로가기
SPRINGBOOT

[spring security] 2. 인증과 인가, securityConfig 설정

by 정공자씨 2024. 1. 10.

 

인증

- 사용자의 신원을 입증하는 과정
- 로그인을 통하여 사용자가 누구인지(예: 회원) 확인하는 과정

 

 

 

인가

1. 인가의 의미

- 경로별로 접근 권한을 확인
- 즉, 사이트의 특정 부분에 접근할 수 있는 권한이 있는지 확인

- 일종의 허가
[ 예시 ]
- 사이트의 
특정 부분에 접근할 수 있는 권한을 가진 자인지 확인
- 관리자 페이지는 관리자 역할을 가진 사람만 허가

- 특정 경로에 요청이 오면, controller에 도달하기 전에, spring security가 filter를 통하여 검증
1. 해당 경로의 접근이 누구에게 열려 있는지
2. 로그인이 완료된 사용자 인지
3. 해당되는 role을 가지고 있는지

 

 

2. securityConfig : 스프링 시큐리티 설정 클래스

  • 특정 경로에 대한 인가 작업 설정
package com.example.test.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.web.SecurityFilterChain;

@Configuration // 설정 클래스를 등록
@EnableWebSecurity // Spring Security에게서 관리가 되는 클래스
public class SecurityConfig {

   // @Bean 생성하면, 필터로 등록이 됨 - 해당 controller로 가기 전 필터를 거침	
   @Bean
   public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // SecurityFilterChain 인터페이스
		
        // 특정 경로에 대한 접근 권한 설정(인가)
        http
            .authorizeHttpRequests( (auth) -> auth   // authorizeHttpRequests: 특정한 경로를 허용하거나 거부할 수 있는 메서드, 람다식 작성
                    .requestMatchers("/", "login", "singup").permitAll()   // requestMatchers: 특정 경로에 대한 작업을 설정
                                                                           // permitAll: 해당 경로에 대해 모든 사용자가 접근 가능

                    .requestMatchers("/admin").hasRole("ADMIN") // 특정한 역할을 가지고 있을 때 사용 가능
                                                                // admin주소에 접근할 때, 로그인 돼 있고 - ADMIN이라는 역할(role)을 갖고 있다면 접근
                    .requestMatchers("/my/**").hasAnyRole("ADMIN", "USER") // 여러가지 role을 설정할 수 있음
                    .anyRequest().authenticated()  // anyRequest: 위에 지정한 url을 제외한 모든 경로, authenticated: 로그인한 사용자만 접근 가능
            );	

        return http.build(); // 해당 http를 build하면, 접근 권한 설정
   }
}

 

 

 

3. 인가 설정에 있어서 문제 발생

 

[ 문제 발생 ] 

[ 문제 발생 ] 예시 : 관리자 페이지(/admin)에 접속을 하려고 하면, 접근이 제한

[ 이유 ]  관리자 페이지는 로그인 하고, 관리자 역할을 부여 받은 자만 접근이 가능하기 때문에 
              접근이 거부


즉, 로그인 없이는 접근 불가능한 페이지로 요청할 시(/admin 등)에 오류 페이지가 나옴

→ 특정 경로에 대한 접근 권한이 없는 경우(예 : 로그인을 하지 않은 경우 등), 자동으로 로그인 페이지로
     redirect 되지 않고, 오류 페이지를 보여줌

 

 

 

[ 문제 해결을 위한 방법] 

  • 커스텀 로그인 설정을 하여 로그인 페이지로 redirect 진행이 필요
security config 클래스 설정하여
로그인 없이 특정 경로에 접근한 경우, 로그인 페이지로 redirect하도록  설정 진행

 

 

 

3-1. 커스텀 로그인 설정

인증을 받지 않은 자가, 접근 제어된 url에 접근 시(예 : /admin), login화면으로 갈 수 있도록 설정

 

package com.example.test.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.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

	@Bean
	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
			
        .......................... 위 코드와 동일
        .......................... 아래 코드 추가
        
        // 2.로그인 페이지 작업 : 인증을 받지 않은 자가 접근 제어된 url에 접근 시, login 화면으로 redirect 할 수 있도록 설정
        http
            .formLogin( (auth) -> auth
                    .loginPage("/login") // 로그인 페이지 경로를 설정: 접근 제어 페이지가 들어가면 오류페이지가 발생하지 않고
                                        // 자동으로 login 페이지 redirect
                    .loginProcessingUrl("/loginProcess") // 로그인한 데이터를 post 요청 시 설정 url로 보냄
                    .permitAll() // 해당 경로에 대해 모든 사용자가 접근 가능
            );

        // 3.csrf(사이트 위변조 방지)는 자동 설정, 동작 되면 post 요청시 csrf token을 같이 보내야 로그인이 진행됨 -> 처음에는 설정을 꺼놔야 함
        http
            .csrf( (auth) -> auth.disable() );

        return http.build(); // 해당 http를 build하면, 해당 권한 설정
	}
}

 

 

관리자 페이지(/admin)에 접근 시, login 페이지로 redirect 처리

admin으로 페이지 설정

admin 경로로 요청




/login 페이지로 redirect 처리


/login 페이지로 redirect 처리