스프링 시큐리티를 이용하는 모든 프로젝트는 이를 위한 별도의 시큐리티 설정 클래스를 사용하는 것이 일반적이다.
따라서 진행할 예제의 프로젝트에 SecurityConfig 클래스를 추가해준다.
@Configuration
@Log4j2
public class SecurityConfig extends WebSecurityConfigurerAdapter { // 모든 시큐리티 관련 설정을 추가하는 곳
}
시큐리티 관련 기능을 쉽게 설정하기 위해 WebSecurityConfigurerAdapter 클래스를 상속 처리한다. WebSecurityConfigurerAdapter 클래스는 주로 override를 통해서 여러 설정을 조정한다.
위의 클래스에는 모든 시큐리티 관련 설정이 추가되는 부분이 된다.
먼저, SampleController를 아래와 같이 구성한다.
@Controller
@Log4j2
@RequestMapping("/sample/")
public class SampleController {
@GetMapping("/all") //로그인을 하지 않은 사용자도 접근
public void exAll(){
log.info("exAll..................");
}
@GetMapping("/member")// 로그인한 사용자만 접근
public void exMember(){
log.info("exMember...................");
}
@GetMapping("/admin")//관리자 권한이 있는 사용자만 접근
public void exAdmin(){
log.info("exAdmin...................");
}
}
각 페이지에 맞는 html도 각각 생성해주고 내부에는 해당 페이지가 어떤 페이지인지만 알 수 있게 처리해준다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>For All </h1> // 각 파일마다 다른 내용을 볼 수 있도록
</body>
</html>
위는 all.html을 작성한 예제이다.
프로젝트를 실행하고 '/sample/all'과 같은 경로를 호출하면 시큐리티로 인해 로그인 화면이 보이게 되고,
서버 내부적으로 여러 개의 필터가 동작하는 것을 확인할 수 있다.
핵심 역할은 Authentication Manager(인증 매니저)를 통해 이루어진다. Authentication Provider는 인증 매니저가 어떻게 동작해야 하는지 결정하고 최종적으로 실제 인증은 UserDetailsService에 의해 이루어진다.
스프링 시큐리티의 가장 핵심 개념은 인증(Authentication)과 인가(Authorization)이다. 이 개념은 간단한 예를 들어 이해할 수 있다.
은행에 금고가 하나 있고, 사용자가 금고의 내용을 열어 본다고 가정해 보면 다음과 같은 과정을 거치게 된다.
1. 사용자는 은행에 가서 자신이 어떤 사람인지 자신의 신분증으로 자신을 증명한다.
2. 은행에서는 사용자의 신분을 확인한다.
3. 은행에서 사용자가 금고를 열어 볼 수 있는 사람인지를 판단한다.
4. 만일 적절한 권리나 권한이 있는 사용자의 경우 금고를 열어준다.
위의 과정에서 1은 인증에 해당하는 작업으로 자신을 '증명'하는 것이고 , 3은 사용자를 '인가'하는 허가를 해주는 과정이다.
필터는 AuthenticationManager를 통해서 "인증"타입의 객체로 작업한다.
(AuthenticationManager가 가진 인증 처리 메서드는 파라미터,리턴타입 역시 Authentication이다.)
인증매니저(AuthenticationManager) : 만약 로그인하는 과정에서 사용자의 아이디/패스워드로 자신이
어떤 사람인지 전달한다고 할 때, 전달된 아이디/패스워드로 실제 사용자에 대해서 검증한다.
실제 동작에서 전달되는 파라미터는 UsernamePasswordAuthenticationToken과 같이 토큰이라는
이름으로 전달된다.
즉, 스프링 시큐리티 필터의 주요역할은 인증 관련된 정보를 토큰이라는 객체로 만들어서 전달한다는
의미
AuthenticationProvider : 데이터베이스를 이용할 것인지, 메모리상에 있는 정보를 활용할 것인지 다양한 방법에 대한 처리, 전달되는 토큰의 타입을 처리할 수 있는 존재인지 확인하고 이를 통해 authenticate()를 수행한다.
AuthenticationProvider는 내부적으로 UserDetailsService를 이용한다.
UserDetailsService: 실제로 인증을 위한 데이터를 가져오는 역할을 한다.
예를 들어 JPA로 Repository를 제작했다면 UserDetailsService를 활용해서
사용자의 인증 정보를 처리한다.
인가=승인(허가)
AuthenticationManager에 authenticate() 메서드의 리턴값은 Authentication이라는 '인증'정보이다.
이 인증 정보 내에는 Roles라는 '권한'에 대한 정보가 있고, 이 정보로 사용자가 원하는 작업을
할 수 있는지 '허가'하게된다.(Access-Control)
'코드로 배우는 스프링부트 웹 프로젝트' 카테고리의 다른 글
Springboot) 스프링 시큐리티 소셜 로그인 처리 (0) | 2022.02.07 |
---|---|
Springboot) UserDetailsService (0) | 2022.01.24 |
Springboot) RedirectAttributes, addFlashAttribute() (0) | 2022.01.17 |
Springboot) @PostMapping (0) | 2022.01.11 |
Springboot) @RestController, @RequestMapping, @GetMapping 예제를 통한 학습 (0) | 2022.01.10 |