해결된 질문
작성
·
384
1
https://www.inflearn.com/questions/770325
안녕하세요.
OAuth2 를 Toggle 버튼 등으로 계정 하나에 여러 SNS 계정을 연동하는 방법에 질문 드렸었는데, 상세 내용 전달 드립니다.
이와 같이, 보여드린 사진처럼 이미 로그인을 한 상태에서 네이버, 카카오 등을 연동하는 것입니다
제가 생각해보았었던 구현 방법을 한번 말씀 드리겠습니다.
사용자 로그인 (JWT)
회원 상세 정보 화면 이동
상세 화면에서 위에서 첨부 드린 사진과 같이, sns 설정을 통해 네이버 연동 시작
네이버 선택시 oauth2/authorization/naver
redirect
사용자 네이버 로그인 과정
네이버 로그인이 완료되면 OAuth2UserService
에서 네이버 계정의 정보를 얻어 오고, 기존 계정과 연동을 하고자 하는데 기존 계정의 정보를 알 수 있는 방법이 도저히 떠오르지 않아서 질문을 드렸었습니다.
한 가지 생각한 것은, 4번의 과정에서 기존 계정을 Cookie 에 저장하고, 추후에 naver 로그인이 완료 되고 AuthenticationSuccessHandler
에서 request 안에 있는 cookie 로 판별하는 것이었습니다.
하지만 이 방법은 (1) 기존 계정에 SNS 연동을 하려고 하는 건지(지금 말씀드리고 있는 방법) (2)계정 로그인이 안된 상태에서 SNS 로그인 과정을 걸치는 건지 2가지 케이스가 있을 것 같은데,
이런 부분을 쿠키를 통해서 분기 처리를 한다는 것이 데이터 정합성에 문제가 생기지 않을까 염려되었습니다. (AuthenticationSuccessHandler
에서 쿠키만으로
기존 password 계정에 SNS 연동을 하는 것인지, 신규 SNS 회원 가입인지 판별하는 것은 위험해보였습니다. )
쿠키 방식 말고, (1) 기존 계정에 SNS 연동을 하려고 하는 건지(지금 말씀드리고 있는 방법) (2)계정 로그인이 안된 상태에서 SNS 로그인 과정을 걸치는 건지 2가지 케이스 를 구분할 수 있는 방법에 대해 조언 해주시면 감사하겠습니다!
답변 1
1
네
이 부분은 기존 계정을 판별할 수 있는 키 값을 어떻게 설계할 것인가의 문제인데 이건 기존 계정이든 신규 계정이건 각 다른 방식의 인증을 공통으로 묶을 수 있는 키를 가지고 있어야 할 것 같습니다.
쿠키는 보안상 안전하지 않기도 하고 키의 역할을 하기에는 부적합해 보입니다.
예전에 했던 사례를 예를 든다면 모든 인증에 본인임을 증명하는 과정(휴대폰인증 등..)을 넣어서 이 과정이 성공적으로 통과하게 되면 본인만의 유니크한 해시값을 생성하고 이 값을 계정과 묶습니다.
그 당시에는 본인인증을 나이스 기관과 연동해서 처리했는데 본인인증이 성공하게 되면 ci 값이라고 해서 주민번호를 해시한 값을 나이스로부터 받았는데 신규 계정을 생성할 때 ci 값과 함께 회원정보를 저장합니다. 그리고 나서 다른 소셜인증을 할 때 만약 신규 인증이면 본인인증을 거치게 하고 여기에서 받은 ci 값과 기존계정에 저장되어 있는 ci 값을 비교해서 서로 일치한다면 기존 계정을 참조할 수 있도록 했습니다.
물론 이 방식은 본인인증을 받는 과정이 중간에 필요했고 그로 인해 본인에게 주어지는 유일한 값인 ci 를 활용했습니다.
만약 이러한 과정이 없다면 무엇이 되었던 서로 다른 소셜인증간의 공통으로 묶을 수 있는 유니크한 값이 필요합니다.
예를 든다면 전화번호+이메일을 직접 해시한 값을 생성해서 절대 중복되지 않는 값을 사용한다거나 등...
사실 이 부분은 OAuth2 나 시큐리티 기술과는 직접적인 관련성은 없어서 정확한 답변을 드리기가 어려운 점 양해 부탁드리며 조금이나마 도움이 되었으면 좋겠습니다.
안녕하세요 강사님
상세한 설명 및 조언 감사드립니다. 정말 많은 도움이 되었고, 해당 방식에 대해서는 좀 더 고민해보도록 하겠습니다
감사합니다!