Spring Security와 OAuth2를 함께 사용하며, 사용자 인증 후 Principal 객체를 통해 사용자의 정보를 가져오려고 했을 때, 일반 로그인과 소셜 로그인 간의 Principal 타입이 달라 문제가 발생
System.out.println(principal.getClass().getName()); 을 메서드에 넣어서 넘어오는 Principal 객체가 어떤 타입인 지 확인했음
else if (principal instanceof OAuth2AuthenticationToken) {
// 소셜 로그인 시 -
// - 소셜 로그인 서비스를 통해 사용자가 인증될 때 생성되는 토큰입니다.
// - 이 토큰은 인증된 사용자의 세부 정보를 포함하게 됩니다.
OAuth2User oauth2User = ((OAuth2AuthenticationToken) principal).getPrincipal();
// 인증된 사용자의 세부 정보(예: 이름, 이메일, 프로필 사진 등)를 담고 있는 'OAuth2User' 객체를 가져옵니다.
String email = oauth2User.getAttribute("email");
// 'OAuth2User' 객체에서 이메일 주소를 추출합니다. 이는 소셜 로그인 제공자가 제공하는 정보 중 하나입니다.
return memberRepository.findByEmail(email).orElse(null);
// 해당 이메일로 'Member' 객체를 데이터베이스에서 찾아 반환합니다.
if (principal instanceof UsernamePasswordAuthenticationToken) {
// 일반 로그인 시 -
// - 사용자가 이름과 비밀번호로 로그인을 시도할 때 생성되는 토큰입니다.
// - 인증이 성공하면, 이 토큰은 인증된 사용자의 정보를 포함하게 됩니다.
// - 여기에서 getName()은 인증된 주체의 식별자(대부분 이메일 또는 ID)를 반환합니다.
String email = ((UsernamePasswordAuthenticationToken) principal).getName();
return memberRepository.findByEmail(email).orElse(null);