[Spring Security] 로그인 이후 유저 정보 받아오기

Simple·2022년 7월 9일
0

Spring

목록 보기
4/5

Spring security를 구현해서 사용하고 있던 도중 궁금한 것이 생겼다.

인증된 유저는 SecurityContextHolder에 저장되는데 클라이언트한테 로그인한 유저의 정보를 받아올 필요가 있을까??

기존 유저를 조회하는 방식을 보면

@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;
    private final ResponseService responseService;

    @GetMapping("/{userId}")
    public SingleResult<TestResponseDto> test(@PathVariable Long id){
        return responseService.getSingleResult(userService.test(id));

    }
}

이런식으로 URL에 유저 id를 PathVariable로 받아왔다.

하지만 로그인 한 유저는 이미 SecurityContextHolder에 저장되어있기 때문에 이를 가져와서 사용할 수 있다.

@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;
    private final ResponseService responseService;

    @GetMapping()
    public SingleResult<TestResponseDto> test(@AuthenticationPrincipal UserDetails userDetails){
        return responseService.getSingleResult(userService.test(userDetails.getUsername()));

    }
}

바로 이렇게 사용할 수 있지는않고 @AuthenticationPrincipal을 사용하기 위해서는 아래와 같이 UserDetailsService를 따로 구현해줘야 한다.

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
    private final UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String email) {
        return userRepository.findByEmailAndStatus(email, Status.ACTIVE)
                .map(this::createUser)
                .orElseThrow(() -> new UsernameNotFoundException(email + "->데이터베이스에서 찾을 수 없습니다."));
    }
}

(나는 Security에 Username을 email로 등록했다)
email을 이용하여 DB에 접근해 유저의 정보를 받아올 수 있었다.

그러면 이점이 무엇일까? 생각을 해본결과

  1. URL에 pk를 노출시키지 않는다.
  2. 인증된 유저라는 것이 보장이 되어있기 때문에 안전(?)
  3. 유저 정보를 간편하게 불러오는 것이 가능

위 3가지 말고는 다른 이점이 생각나지않는다.

확실한 이점을 아시는분은 댓글 달아주시면 감사하겠습니다.

profile
몰입하는 개발자

0개의 댓글