해결된 질문
작성
·
509
·
수정됨
1
안녕하세요.
섹션 9. OAuth 2.0 Client - Social Login (Google, Naver, KaKao) + FormLogin 에서의 User 도메인에 대한 질문입니다.
username 에 대한 질문
폼 로그인에 사용되는 계정과 OAuth 2.0 로그인에 사용되는 계정을 추상화하는 과정에서
제공자 계정의 (변경가능한) 별명에 해당하는 값을 username으로 받는 것으로 보입니다.
하지만 클라이언트 자체 계정에서의 username 은 고유하기 때문에
Q1) 이를 동일한 속성을 갖도록하는게 맞는지 혹은 해도 무방한지
Q2) 이를 별도의 속성으로 받아도 괜찮은지 궁금합니다. (e.g. nickname)
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 에 적합해보이는데 이에 대한 의견을 듣고 싶습니다.
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;
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 인증과 구별되는 무엇인가를 넣는 속성으로 활용하신다면 해당 속성에 임의의 값을 설정하는 것도 괜찮습니다.