인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

ykmykm4608님의 프로필 이미지
ykmykm4608

작성한 질문수

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

계좌등록 서비스 테스트

@AuthenticationPrincipal 사용이 가능한 이유가

작성

·

1.3K

0

처음에 로그인시 헤더에 jwt 토큰이 저장되고

securityContextholder, 시큐리티 세션에 저장된 loginUser가 stateless 설정에 의해 삭제 되지

계좌등록 컨트롤러에 @AuthenticationPrincipal로 세션에 저장된 loginUser를 사용이 가능한 이유가

JwtAuthrizaitionFilte에서

아래 코드로 securityContextholder에 인증이나 권한체크용으로 저장 되기 떄문에 사용이 가능한걸까요? 맞는거같은데 확실해지고자 여쭤봅니다...

Authentication authentication = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
//강제로 authentication 객체를 생성

SecurityContextHolder.getContext().setAuthentication(authentication); //강제 로그인

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.
@AuthenticationPrincipal을 사용할 수 있는 이유는 JwtAuthrizaitionFilte에서 SecurityContextHolder.getContext().setAuthentication(authentication); 코드를 통해 SecurityContextHolder에 인증 객체를 저장하기 때문입니다.

JwtAuthrizaitionFilte에서는 인증에 성공한 사용자 정보를 가지고 UsernamePasswordAuthenticationToken 객체를 생성하고, SecurityContextHolder에 저장해 세션에 해당 사용자 정보를 유지시킵니다. 이렇게 저장된 사용자 정보는 @AuthenticationPrincipal을 사용하여 컨트롤러에서 쉽게 사용할 수 있습니다.

즉, @AuthenticationPrincipal은 시큐리티 컨텍스트 홀더에 저장된 인증 객체의 principal(사용자)을 가져와 사용하는 어노테이션입니다.

위의 코드를 통해 SecurityContextHolder에 Authentication 객체를 저장하면, 해당 사용자의 인증 정보를 활용할 수 있는 상태가 되고, @AuthenticationPrincipal을 통해 loginUser와 같은 정보를 접근할 수 있습니다.

이 부분이 해결되셨길 바랍니다. 추가로 궁금한 점이 있으면 답변해주세요. 감사합니다.

ykmykm4608님의 프로필 이미지
ykmykm4608

작성한 질문수

질문하기