소셜 로그인 구현하기

구글 설정

구글 클라우드 콘솔으로 접속하여 설정을 진행합니다.

상단의 [새프로젝트]를 클릭하여 프로젝트를 생성합니다.

이름을 설정하여 최종 생성을 진행합니다.

[좌상단 햄버거 버튼 클릭] - [API 및 서비스] - [OAuth 동의 화면] 클릭, 외부 옵션을 체크 후 [만들기] 클릭

다음 화면에 접속하여 사용자에게 보여줄 로그인 화면을 만듭니다.

[범위 추가 또는 삭제]를 클릭하여 제공받을 유저 정보의 scope를 설정해야합니다. 이 예제에서는 이메일과 프로필, 오픈아이디를 사용합니다. 체크한 후 밑의 [업데이트]를 클릭하여 반영합니다.

이후 테스트 사용자와 요약페이지는 건너뜁니다.

[사용자 인증 정보] - [사용자 인증 정보 만들기] - [OAuthClientID]를 클릭합니다.

애플리케이션 유형을 웹 애플리케이션, redirection url을 설정합니다.

생성된 클라이언트 ID와 보안 비밀번호를 확인하고 다른 파일에 복사해둡니다.

네이버 설정

네이버 개발자 센터으로 이동합니다.

[Applicaion] - [애플리케이션 등록]으로 이동합니다.

[사용 API] - [네이버 로그인] 클릭한 후 다음과 같이 설정을 진행합니다.

클라이언트 ID와 시크릿을 확인합니다.

기본 설정

User 정보

Provider User

public interface ProviderUser {  
  
    public String getId();  
    public String getUsername();  
    public String getPassword();  
    public String getEmail();  
    public String getProvider();  
    public List<? extends GrantedAuthority> getAuthorities();  
    public Map<String, Object> getAttributes();  
  
}

인터페이스로 기본 로직에 대한 골격을 작성합니다.

OAuth2ProviderUser

@Data  
public abstract class OAuth2ProviderUser implements ProviderUser {  
  
    private Map<String, Object> attributes;  
    private OAuth2User oAuth2User;  
    private ClientRegistration clientRegistration;  
  
    public OAuth2ProviderUser(Map<String, Object> attributes, OAuth2User oAuth2User, ClientRegistration clientRegistration){  
        this.attributes = attributes;  
        this.oAuth2User = oAuth2User;  
        this.clientRegistration = clientRegistration;  
    }  
  
    @Override  
    public String getPassword() {  
        return UUID.randomUUID().toString();  
    }  
  
    @Override  
    public String getEmail() {  
        return (String)attributes.get("email");  
    }  
  
    @Override  
    public String getProvider() {  
        return clientRegistration.getRegistrationId();  
    }  
  
    @Override  
    public List<? extends GrantedAuthority> getAuthorities() {  
        return oAuth2User.getAuthorities().stream().map(authority -> new SimpleGrantedAuthority(authority.getAuthority())).collect(Collectors.toList());  
    }  
}

추상 클래스를 활용해 공통 로직의 구현부를 미리 정의합니다.

User 구현체

public class GoogleUser extends OAuth2ProviderUser {  
  
    public GoogleUser(OAuth2User oAuth2User, ClientRegistration clientRegistration){  
        super(oAuth2User.getAttributes(), oAuth2User, clientRegistration);  
    }  
  
    @Override  
    public String getId() {  
        return (String)getAttributes().get("sub");  
    }  
  
    @Override  
    public String getUsername() {  
        return (String)getAttributes().get("sub");  
    }  
  
}

각 벤더에 맞게끔 user 정보를 담을 구현체를 정의합니다. google의 경우 user정보로 id와 username을 제공하기 때문에 위와 같이 정의합니다.