지난 글들을 작성할때 , Todo 리스트에 대한 CRUD 기능을 구현할때
고정적인 아이디를 사용했습니다!
이땐 로그인 기능이 구현되지 않았어서 고정적으로 사용했었습니다.
그리고 이 기능을 아직도 사용하고있었습니다.
이제 이 메서드들이 인증된 사용자 아이디를 사용할 수 있도록 각 메서드에 userid라는 매개변수를 추가해줍시다!
우선 최초 url 매핑을 담당하는 SO부분을 수정시켜줍시다.
@AuthenticationPrincipal String userId
해당 어노테이션을 이용해서 로그인되어있는
권한을 가져오는겁니다. 그리고 컨트롤러 오브젝트 단에서도
아이디를 매개변수로 받아서 해당 아이디로 셋팅하게됩니다.

그런데말입니다...
userId는 도대체 누가 어떻게 String 인것을 알고 넘겨주는 걸까요?
이 매개변수는 스프링이 넘겨준다는 것을 우선은 알수 있습니다.
그러면 스프링은 어떻게 알고 userId를 넘겨주는 것일까요?
@AuthenticationPrincipal 를 이용하는겁니다.
AuthenticationPrincipal 는 무엇일까요?
답을찾기위해 JwtAutnehnticiationFilter 클래스로 들어가보도록 하겠습니다. (전에 만든 포스팅 참고!)
우리는 JwtAuthenticationFilter에서 UsernamePasswordAuthenticationToken을 생성했었습니다.
이때 생성자의 첫 매개변수로 넣은 것이 AuthenticationPrincipal 입니다. 그리고 String 형태의 userId를 넣어주었습니다.
또 이 오브젝트를 SecurityContext에 등록했습니다.
이제 해답이 보입니다....
스프링은 컨트롤러 메서드를 부를 때 @AuthenticationPrincipal 어노테이션이 있다는 것을 알고있습니다.
그래서 SecurityContextHolder 에서 SecurityContext::Authentication, 즉 UsernamePasswordAuthenticationToken오브젝를 가져옵니다.
이 오브젝트에서 AuthenticationPrincipal을 가져와 컨트롤러 메서드에 넘겨주는 겁니다.
다시말해서,
우리가 userId를 받아오고 싶다고 대뜸 String userId를 매개변수로 추가한 것이 아니고,
우리가 만든 JwtAuthenticationFilter 클래스에서 AuthenticationPrincipal 을 String 형의 오브젝트로
지정했기 때문에 어노테이션의 형으로 String을 사용해야 한다는 것을 미리 알려주고 알게된것입니다.
Todo 리스트에 대한 기능을 수정했으니 테스팅을 해보록 해보겠습니다.
테스트방법은
- 아이디를 2개 만들고 첫번째로 로그인을 합니다.
- 글을 2개작성합니다.
- 두번째 아이디로 로그인을 하고
- 글이 있는지 확인해봅니다.
아이디를 2개를 만들었습니다.
그리고 첫번째 아이디로 로그인을 해주었습니다.
Bearer토큰을 설정해주는것도 잊지않고 해주어야 합니다!!
이렇게 첫번째 아이디로 2개의 글을 작성했습니다.
이제 두번째 아이디로 로그인을 해줍니다.
로그인을 동일하게 해주고, 토큰을 베어토큰에 복붙을 해주고 글을 추가해줍시다.
이렇게 아이디 별로 보이도록 설정했으므로, 본인 글만 나오는것을 확인할 수 있습니다.!!

다음에는 패스워드를 암호화하는 기능을 구현해보도록 해보겠습니다!
'Spring boot 프로젝트 기록 > 3. 인증 백엔드 통합' 카테고리의 다른 글
패스워드 암호화 (0) | 2021.12.13 |
---|---|
JWT 를 이용한 인증 구현 (0) | 2021.12.12 |
스프링 시큐리티 통합 -1 (0) | 2021.12.08 |
REST security를 구현해보자! (0) | 2021.12.02 |
댓글