22.10.04~07.Tue - codestates-seb/seb39_main_055 GitHub Wiki
윤준영:
- 작성하기로 한 댕댕이숲 관련 API를 모두 작성. 다행이라는 생각이 들었다.
- 박소영님이 소셜로그인 구현하는 과정의 일부에 참여. 내가 코드를 짠 것은 아니지만 되지 않던 기능이 하나씩 가능해지는 것을 보면서 짜릿함을 느꼈다. (소영님 고생 많으셨어요.)
- API 하나하나씩 코드의 구성과 흐름이 어떻게 되는지 천천히 복습 중.
- 이전에도 각종 발표영상에 참여한 적이 있었고 쉽지 않다고 느꼈는데 이번에도 프로젝트 영상 촬영은 쉽지 않았다. 발표의 절반 이상을 맡은 팀장님, 수고하셨습니다.
- 우리 팀 모든 팀원분들 수고하셨습니다. 화요일까지 부족한 부분들 잘 보충하면서~ 무사히 프로젝트를 마칠 것이라 믿어요.
박소영:
- Refresh token 도입
→Jwt 의 보안방식을 채택했기 때문에 기존 access token에 더해 Refresh token을 도입해주었다.
→로그인시 JwtAuthenticationFilter에서 Refresh token도 생성해서 refresh 헤더로 넘겨주자
- 소셜로그인 도입
→스프링 시큐리티 jwt기반으로 oauth2를 구현했다.
→백엔드 서버에서
- Resorce server에서 Autorization Code를 받는다
- Autorization Code로 Resorce server에서 access token을 받는다
- access token으로 scope(유저 이메일, 프로필 사진, 유저 닉네임)을 받아온다.
→위의 과정중 2번 access token 받는 거 까지 성공시, OAuth2UserService인터페이스 구현체인 CustomOAuth2UserService 클래스가 실행되게 하였다.
-
CustomOAuth2UserService 클래스는 loadUser 메소드를 통해 리소스 서버에서 받아온 access token 으로 유저 정보 scope로 지정해논 이메일, 프로필 사진, 닉네임을 가지고 온다.
그리고 이 정보들을 이용해 이메일,userStatus,어떤 타업체에서 소셜로그인 시도 했는지 를 가지고 유저 리포지토리에서 조회후, 해당 유저가 이미 DB에 저장되어 있으면 냅두고, 없으면 새로 유저테이블에 해당 유저를 등록시키는 역할을 한다.
→ 그 후 AuthenticationSuccessHandler 인터페이스의 구현체인SimpleUrlAuthenticationSuccessHandler 를 상속받아서 OAuth2MemberSuccessHandler클래스를 정의했고, 해당 클래스는 위의 CustomOAuth2UserService를 실행하고 난뒤 실행된다.
- OAuth2MemberSuccessHandler는 해당 소셜 로그인 유저의 어세스 토큰과 리프레시 토큰을 생성해서 클라이언트 쪽 uri로 쿼리파라미터에 넣어주어 리다이렉트를 통해 전달하는 역할을 한다
❗[문제 발생]
소셜로그인 구현과정중 구글과 네이버의 경우에는 잘 실행이 되는데, 카카오의 경우 잘 되지 않았다.
❕[해결책]
어디서 문제가 생기는 지 파악을 하기위해
-
CustomOAuth2UserService 의 loadUser 메소드의 진입점과 return 전에 로그를 심어 주었다.
-
OAuth2MemberSuccessHandler의 onAuthenticationSuccess메소드의 진입점과 return전에 로그를 심어주었다.
그 결과 1)에서는 문제가 생기지 않았으나
2)에서 onAuthenticationSuccess메소드의 진입점 로그까지 출력됐으나 마지막 return 전의 로그가 출력이 안되고있는 걸 발견했다.
따라서 어세스 토큰을 잘 받아와서 유저 scope 까지 잘 조회한 걸 알 수 있다.
다시 onAuthenticationSuccess메소드에서
를 추가해서 로그를 확인해보니
구글 소셜로그인의 경우)
authentication.getPrincipal():
Name: [105710115349154407870],
Granted Authorities: ROLE_USER,
User Attributes: [
{sub=105710115349154407870,
name=박소영,
given_name=소영,
family_name=박, picture=https://lh3.googleusercontent.com/a/ALm5wu2tVlN6bAGctj5lkm5ItC6ndLdN4-3fJHTQV8yZ=s96-c, [email protected], email_verified=true, locale=ko}
]
네이버 소셜로그인의 경우)
authentication.getPrincipal():
Name: [h_8K9JPaVQ8JVhqlhL1vaqsEwWvlQvQLJ3Hx58_uRsA],
Granted Authorities: ROLE_OWNER,
User Attributes: [
{id=h_8K9JPaVQ8JVhqlhL1vaqsEwWvlQvQLJ3Hx58_uRsA, profile_image=https://ssl.pstatic.net/static/pwe/address/img_profile.png, [email protected], name=박소영}
]
카카오 소셜로그인의 경우)
authentication.getPrincipal():
Name: [2473439802],
Granted Authorities: ROLE_USER,
User Attributes: [
{id=2473439802,
connected_at=2022-10-06T01:37:23Z,
properties={nickname=박소영, profile_image=http://k.kakaocdn.net/dn/bUhecS/btrN9kv8m82/3gljzFfwwNmf1KAYEmpACk/img_640x640.jpg, thumbnail_image=http://k.kakaocdn.net/dn/bUhecS/btrN9kv8m82/3gljzFfwwNmf1KAYEmpACk/img_110x110.jpg},
kakao_account={
profile_nickname_needs_agreement=false, profile_image_needs_agreement=false,
profile={nickname=박소영, thumbnail_image_url=http://k.kakaocdn.net/dn/bUhecS/btrN9kv8m82/3gljzFfwwNmf1KAYEmpACk/img_110x110.jpg, profile_image_url=http://k.kakaocdn.net/dn/bUhecS/btrN9kv8m82/3gljzFfwwNmf1KAYEmpACk/img_640x640.jpg,
is_default_image=false
},
has_email=true,
email_needs_agreement=false,
is_email_valid=true,
is_email_verified=true,
[[email protected]](mailto:email=[email protected])}}
]
로 email이 구글과 네이버는 attribute map에 email 키 값으로 들어가 있었다면
카카오의 경우 attribute map에서 kakao_account키값으로 들어간 후 한번 더 email 키값으로
접근해야 email이 있었다 따라서 기존 코드를
로 바꾸고 나니, 에러가 나지 않았다.