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

buo642g님의 프로필 이미지
buo642g

작성한 질문수

스프링 시큐리티 OAuth2

username, clientId, registrationId

해결된 질문

작성

·

509

·

수정됨

1

안녕하세요.
섹션 9. OAuth 2.0 Client - Social Login (Google, Naver, KaKao) + FormLogin 에서의 User 도메인에 대한 질문입니다.

 

  1. username 에 대한 질문

     

    폼 로그인에 사용되는 계정과 OAuth 2.0 로그인에 사용되는 계정을 추상화하는 과정에서

    제공자 계정의 (변경가능한) 별명에 해당하는 값을 username으로 받는 것으로 보입니다.

     

    하지만 클라이언트 자체 계정에서의 username 은 고유하기 때문에
    Q1) 이를 동일한 속성을 갖도록하는게 맞는지 혹은 해도 무방한지
    Q2) 이를 별도의 속성으로 받아도 괜찮은지 궁금합니다. (e.g. nickname)

     

     

 

 

  1. id + username 에 대한 질문


    "sub" 혹은 "id" 로 매핑되어있는 값을 id라는 필드에 넣도록 구현되어있는데

     

    public class NaverUser extends OAuth2ProviderUser {
    
        @Override
        public String getId() {
            return (String)getAttributes().get("id"); // !
        }
    
    public class GoogleUser extends OAuth2ProviderUser {
    
        @Override
        public String getId() {
            return (String)getAttributes().get("sub"); // !
        }

    네이버 문서에 아래와 같은 내용이 있습니다.

    위 설명에 따르면 네이버를 기준으로 id가 클라이언트 자체 계정에서의 username 과 동일한 역할을 하는 것으로 보입니다.


    Q3) 따라서 1번 질문과 반대로 id 필드에 저장되는 값이 오히려 username 에 적합해보이는데 이에 대한 의견을 듣고 싶습니다.

 

 

 

  1. clientId 에 대한 질문

     

    User 클래스에 String ci (clientId) 필드가 포함되어 있는데,
    Q4) 이는 외부 설정파일로부터 설정하는데 저장해야할 필요가 있나요? 지워도 무방한가요?

     

    public class User {
    
        private String registrationId;
        private String id;
          private String ci; // !
        private String username;
        private String password;
        private String provider;
        private String email;
        private String picture;
        private List<? extends GrantedAuthority> authorities;

     

 

 

  1. registrationId 에 대한 질문

     

    registrationId 가 provider(google...) 를 의미하는 것으로 보이는데,

    Q6) FormLogin 클래스에 registrationId, provider 두 필드가 모두 존재합니다.
    하나는 지워도 무방한가요?

     

    public abstract class OAuth2ProviderUser implements ProviderUser {
    
        @Override
        public String getProvider() {
            return clientRegistration.getRegistrationId(); // !
        }
    public class FormUser implements ProviderUser {
    
          private String registrationId; // !
        private String id;
        private String username;
        private String password;
        private String email;
        private boolean isCertificated;
          private String provider; // !

 

 

 

답변 1

1

정수원님의 프로필 이미지
정수원
지식공유자

네 아주 꼼꼼한 질문 감사드립니다

1번

  • 말씀 하신대로 username 은 유니크한 값이 들어가는 것이 맞습니다. 다만 사용자명을 별도로 화면에 출력하기 위한 용도로써의 속성도 필요한데 그것은 nickname 이라는 속성을 별도로 두면 될 것 같습니다.

2번

  • 네 맞습니다. id 는 고유한 아이디의 역할을 합니다. username 에 넣어서 활용하시면 되고 id 는 DB 의 시퀀스로 대체해도 괜찮습니다.

3번

  • ci 는 일반적으로 주민번호를 해시한 고유값으로 사용됩니다. 여기에서는 본인인증 이후 받게 되는 값으로 ci 속성을 넣었는데 해당 예제에서는 그렇게 중요한 것이 아니니 무시하셔도 됩니다.

4번

  • 사실 FormUser 에서는 RegistrationId 와 provider 둘 모두 필요하지 않는 속성입니다. 통일성을 위해 넣긴 했지만 필수가 아닌 옵션으로 생각하시면 됩니다. 다만 OAuth2 인증과 구별되는 무엇인가를 넣는 속성으로 활용하신다면 해당 속성에 임의의 값을 설정하는 것도 괜찮습니다.

buo642g님의 프로필 이미지
buo642g

작성한 질문수

질문하기