그 주의 화요일, 금요일을 지정 날짜로 업데이트 합니다
저번주에 이어 운영체제에 대해 포스팅을 재정리하고자 다시 한번 학습하게 되었다.
1-3. 프로세스, 스레드와 관련하여 재정리 (교착상태, 경쟁상태 등)
1-4. 메모리와 관련하여 재정리 (페이지 교체 알고리즘, 세그멘테이션 등)
이미 로그인한 사용자의 정보 를 매개변수로 전달받을 방법을 고민하던 중
Spring Security의 @AuthenticationPrincipal
어노테이션에 관하여 알게 되었고,
이와 관련해서 Spring Security 와 @AuthenticationPrincipal에 대해 학습해보게 되었다.
스프링 시큐리티는 SecurityContext에 인증된 Authentication(인증) 객체를 넣어두고 현재 스레드 내에서 공유되도록 관리하고 있다.
AuthenticationPrincipalArgumentResolver 클래스를 활용하여 resolveArgument 메소드를 구현하고, SecurityContext에 저장된 인증객체를 기반으로 Authentication 객체를 꺼내오게 된다.
인증 객체(Authentication)에서 Principal 를 꺼내고, 해당 어노테이션이 붙은 파라미터가 존재한다면 해당 Principal를 리턴해주면 된다.
HandlerMethodArgumentResolver
인터페이스
Controller의 Argument(Parameter)에 지정된 변수들을, Annotation이나 객체의 Type에 따라서 Resolver를 먼저 거쳐, 실제 Data를 Controller에 넘겨주는 역할을 수행한다.
사용하는 이유는, 매개변수로 사용되는 인자에 대해 공통적으로 처리해야할 로직 등이 있을 경우 중복 코드를 줄이고 공통 기능으로 추출하여 사용할 수 있다.
AuthenticationPrincipalArgumentResolver
HandlerMethodArgumentResolver 를 구현한 구현체로 @AuthenticationPrincipal 어노테이션이 실제로 사용되는 부분이다.
Authentication
인터페이스
인증 정보에 대한 부분을 정의해놓은 인터페이스.
Principal(인증되는 주체의 ID), Credentials(주체가 정확한지 증명하는 것), Authorities(권한)에 대한 정의가 되어있다.
UserDetails
인터페이스
사용자 정보(username, password 등)을 가지는 인터페이스.
이를 구현하여 실제 로그인에 사용할 클래스를 만들면 된다. 스프링 시큐리티 내부적으로 직접 사용하지는 않고 Authentication 으로 캡슐화하여 저장된다. 따라서 UserDetails 구현체의 정보는 Spring Security Context에 저장된 Authentication 객체가 가져간다고 볼 수 있다.
SecurityContext
인터페이스
Authentication에 대한 접근 getter를 정의해놓은 인터페이스
인증을 통한 기능 구현 미션
@AuthenticationPrincipal
적용 예제@GetMapping("/members/me") public ResponseEntity<MemberResponse> findMemberOfMine(@AuthenticationPrincipal LoginMember loginMember) { MemberResponse member = memberService.findMember(loginMember.getId()); return ResponseEntity.ok().body(member); }
인증을 통한 기능 구현 미션을 하면서 @AuthenticationPrincipal 어노테이션을 이해하고 사용하려다보니 Spring Security 에 대해 학습할 수 있었다. Spring Security는 아직 혼동되는 부분이 많아서 다시 차근 차근 살펴봐야할 것 같다!😣
[참조]
https://sas-study.tistory.com/410
https://webcoding-start.tistory.com/59
https://velog.io/@gillog/Spring-HandlerMethodArgumentResolver-PathVariable-RequestHeader-RequestParam /HandlerMethodArgumentResolver
https://mangkyu.tistory.com/76 /Spring Security