· 오늘 공부한 것
Spring Security 프레임 워크
로그인
· 공부한 내용, 궁금한 내용, 부족한 내용
// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
spring security 프레임워크를 build.gradle 에 추가한 모습이다.
전에 서버에 요청을 하게 되면 controller에서 맵핑이 되어 들어갔는데 그전에 DispatcherServlet을 통과하게 된다. 여기서 이 보다 더 이전 단계가 앞에서 배운 Filter 부분인데 Spring Security도 이것을 사용한다.
Form login 기반을 사용할 때 username과 password를 확인하여 인증한다.
- 사용자가 username과 password를 제출하면 UsernamePasswordAuthenticationFilter는 인증된 사용자의 정보가 담기는 인증 객체인 Authentication의 종류 중 하나인 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 넘겨 인증을 시도합니다.
- 실패하면 SecurityContextHolder를 비웁니다.
- 성공하면 SecurityContextHolder에 Authentication를 세팅합니다.
WebSecurityConfig 파일에서 아래와 같은 코드를 확인한다.
requestMatchers("/api/user/**").permitAll()
인증이 필요 없는 URL들을 간편한게 허가할 수 있다.
anyRequest().authenticated()
인증이 필요한 URL들도 간편하게 처리할 수 있다.
UserDetailsService 인터페이스를 상속받은 UserDetailsServiceImpl에서 user 정보를 DB에서 가져와서 UserDetails를 상속받은 UserDetailsImpl 객체에 넣어준다. 이러면 로그인을 하게 되면 로그인한(인증된) 유저의 정보가 UserDetailsImpl에 담겨 있게 된다.
이것을 가져와서 사용을 할 때 controller에서 어노테이션을 사용해 주면 되는데 그것이 @AuthenticationPrincipal이다.
@Controller
@RequestMapping("/api")
public class ProductController {
@GetMapping("/products")
public String getProducts(@AuthenticationPrincipal UserDetailsImpl userDetails) {
// Authentication 의 Principal 에 저장된 UserDetailsImpl 을 가져옵니다.
User user = userDetails.getUser();
System.out.println("user.getUsername() = " + user.getUsername());
return "redirect:/";
}
}
· 오늘 서칭 한 자료
· 느낀 점
- Spring Security를 사용하면 쉽게 인증을 처리하고 로그인한 유저의 정보를 가져올 수 있었다. 하지만... 혼자서 적용할 수 있을지 의문이 든다.
- 코드스니펫 딸깍... 복붙이다... 복습하며 코드 한 줄씩 이해하는 과정이 필요할 거 같다.
- Filter를 잘 정리해 두면 controller단으로 넘어가기 전에 많은 것을 처리할 수 있을 거 같다.
'Today I Learned' 카테고리의 다른 글
2023-11-15 TIL (0) | 2023.11.15 |
---|---|
2023-11-14 TIL (0) | 2023.11.14 |
2023-11-07 TIL (0) | 2023.11.07 |
2023-11-06 TIL (0) | 2023.11.06 |
2023-11-03 TIL (0) | 2023.11.03 |