- 부트 캠프 수료 후 내가 조금 더 자세히 알고 싶었던 내용들에 대해서 공부를 하며 공부한 내용을 시각화하면서 조금 더 잘 이해하기 위해서 남기는 글이다.
- 이 글은 강의를 들으면서 내가 알게 된 내용을 스스로 draw.io를 활용하여 그림을 그리고, 정리한 내용입니다.
@GetMapping("/user/{id}/update")
public String update(@PathVariable int id, @AuthenticationPrincipal PrincipalDetails principalDetails) {
// 1. 어노테이션을 활용한 user 정보 출력
System.out.println("[session 정보] :" + principalDetails.getUser());
// 2. 직접 찾아서 꺼내는 방법을 활용한 user 정보 출력
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
PrincipalDetails principalDetails1 = (PrincipalDetails) authentication.getPrincipal();
System.out.println("[principalDetails1] = " + principalDetails1.getUser());
return "user/update";
}
* 참고 * : principalDetails 는 UserDetails 인터페이스를 구현한 클래스이다.
클라이언트에서 SecurityConfig 설정을 한 요청 url로 요청이 들어오면 security 가 그 요청을 가로채서 인증, 인가 과정을 거치게 된다.
(이 사이에서 Filter언급이 빠진 게 아닐까? -> Filter 관련 글은 책을 보고 추후에 다시 언급 후 링크를 추가해야겠다.)
PrincipalDetailsService는 전달받은 user의 정보가 DB에 존재하는 정보인지 우선 확인을 한 뒤, 없는 정보면 그대로 내보내고,
DB에 존재하는 User의 정보일 경우 PrincipalDetails 객체를 생성한다.
그리고 이 객체를 SecurityContextHolder 안에 SecurityContext 안에 Authentication이라는 객체에 User의 정보를 저장하게 된다.
즉, 이것이 세션에 사용자의 정보를 저장하는 것과 유사하다고 생각하면 될 것 같다.
이렇게 저장된 User의 정보를 필요시 꺼내와 확인하거나 활용을 해야하는데 "SecurityContextHolder 안에 SecurityContext 안에 Authentication이라는 객체" 어쩌고저쩌고 꺼내어 쓰기가 너무 불편한 구조로 겹겹이 쌓여있는 것을 발견할 수 있다.
물론 하나씩 꺼내어 사용할 수 있다. 아래의 코드처럼
@GetMapping("/user/{id}/update")
public String update(@PathVariable int id){
// 직접 찾아서 꺼내는 방법을 활용한 user 정보 출력
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
PrincipalDetails principalDetails1 = (PrincipalDetails) authentication.getPrincipal();
System.out.println("[principalDetails1] = " + principalDetails1.getUser());
return "user/update";
}
하지만 너무 복잡해지고 코드가 너무 길어진다.
따라서 우리는 어노테이션을 활용하여 Authentication 객체 안에 들어있는 PrincipalDetails 를 꺼낼 수 있다.
@GetMapping("/user/{id}/update")
public String update(@PathVariable int id, @AuthenticationPrincipal PrincipaDetails principalDetails) {
// 어노테이션을 활용한 user 정보 출력
System.out.println("[session 정보] :" + principalDetails.getUser());
}
짠! 매우 간결하다!
'👩💻 BackEnd > 🍃 스프링부트 [SpringBoot]' 카테고리의 다른 글
[ Spring Boot / thymleaf ] spring mvc 2 검증 내용 정리 (0) | 2024.02.22 |
---|---|
[JSP / Spring Boot] 시큐리티 태그 라이브러리 (0) | 2024.02.21 |
[SpringBoot] @JsonProperty(access = Access.WRITE_ONLY) (0) | 2024.01.06 |
[SpringBoot] 21강 전처리와 후처리 (1) | 2024.01.04 |
[SpringBoot] 19강 CSFR 토큰 해제 (0) | 2024.01.02 |