인증
- 사용자의 신원을 입증하는 과정
- 로그인을 통하여 사용자가 누구인지(예: 회원) 확인하는 과정
인가
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 경로로 요청 /login 페이지로 redirect 처리 |
'SPRINGBOOT' 카테고리의 다른 글
[spring security] 5. DB 연결하기 (0) | 2024.01.10 |
---|---|
[spring security] 3. springconfig 설정 : BCrype 암호화 메서드 (0) | 2024.01.10 |
[SpringBoot] DAO와 Mapper 인터페이스의 차이? (0) | 2024.01.10 |
[spring security] 1. 스프링 시큐리티의 동작 원리 (0) | 2024.01.10 |
클라이언트와 서버 (0) | 2024.01.02 |