22.10.04~07.Tue - codestates-seb/seb39_main_055 GitHub Wiki

윤준영:

  1. 작성하기로 한 댕댕이숲 관련 API를 모두 작성. 다행이라는 생각이 들었다.
  2. 박소영님이 소셜로그인 구현하는 과정의 일부에 참여. 내가 코드를 짠 것은 아니지만 되지 않던 기능이 하나씩 가능해지는 것을 보면서 짜릿함을 느꼈다. (소영님 고생 많으셨어요.)
  3. API 하나하나씩 코드의 구성과 흐름이 어떻게 되는지 천천히 복습 중.
  4. 이전에도 각종 발표영상에 참여한 적이 있었고 쉽지 않다고 느꼈는데 이번에도 프로젝트 영상 촬영은 쉽지 않았다. 발표의 절반 이상을 맡은 팀장님, 수고하셨습니다.
  5. 우리 팀 모든 팀원분들 수고하셨습니다. 화요일까지 부족한 부분들 잘 보충하면서~ 무사히 프로젝트를 마칠 것이라 믿어요.

박소영:

  1. Refresh token 도입

→Jwt 의 보안방식을 채택했기 때문에 기존 access token에 더해 Refresh token을 도입해주었다.

→로그인시 JwtAuthenticationFilter에서 Refresh token도 생성해서 refresh 헤더로 넘겨주자

  1. 소셜로그인 도입

→스프링 시큐리티 jwt기반으로 oauth2를 구현했다.

→백엔드 서버에서

  1. Resorce server에서 Autorization Code를 받는다
  2. Autorization Code로 Resorce server에서 access token을 받는다
  3. access token으로 scope(유저 이메일, 프로필 사진, 유저 닉네임)을 받아온다.

→위의 과정중 2번 access token 받는 거 까지 성공시, OAuth2UserService인터페이스 구현체인 CustomOAuth2UserService 클래스가 실행되게 하였다.

  • CustomOAuth2UserService 클래스는 loadUser 메소드를 통해 리소스 서버에서 받아온 access token 으로 유저 정보 scope로 지정해논 이메일, 프로필 사진, 닉네임을 가지고 온다.

    그리고 이 정보들을 이용해 이메일,userStatus,어떤 타업체에서 소셜로그인 시도 했는지 를 가지고 유저 리포지토리에서 조회후, 해당 유저가 이미 DB에 저장되어 있으면 냅두고, 없으면 새로 유저테이블에 해당 유저를 등록시키는 역할을 한다.

→ 그 후 AuthenticationSuccessHandler 인터페이스의 구현체인SimpleUrlAuthenticationSuccessHandler 를 상속받아서 OAuth2MemberSuccessHandler클래스를 정의했고, 해당 클래스는 위의 CustomOAuth2UserService를 실행하고 난뒤 실행된다.

  • OAuth2MemberSuccessHandler는 해당 소셜 로그인 유저의 어세스 토큰과 리프레시 토큰을 생성해서 클라이언트 쪽 uri로 쿼리파라미터에 넣어주어 리다이렉트를 통해 전달하는 역할을 한다

❗[문제 발생]

소셜로그인 구현과정중 구글과 네이버의 경우에는 잘 실행이 되는데, 카카오의 경우 잘 되지 않았다.

❕[해결책]

어디서 문제가 생기는 지 파악을 하기위해

  1. CustomOAuth2UserService 의 loadUser 메소드의 진입점과 return 전에 로그를 심어 주었다.

  2. OAuth2MemberSuccessHandler의 onAuthenticationSuccess메소드의 진입점과 return전에 로그를 심어주었다.

그 결과 1)에서는 문제가 생기지 않았으나

2)에서 onAuthenticationSuccess메소드의 진입점 로그까지  출력됐으나 마지막 return 전의 로그가 출력이 안되고있는 걸 발견했다.

따라서 어세스 토큰을 잘 받아와서 유저 scope 까지 잘 조회한 걸 알 수 있다.

다시  onAuthenticationSuccess메소드에서

Untitled

를 추가해서 로그를 확인해보니

구글 소셜로그인의 경우)

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이 있었다 따라서 기존 코드를

Untitled

로 바꾸고 나니, 에러가 나지 않았다.