SpringBook 카카오 소셜 로그인하다 궁금한 점

eunsiver·2023년 3월 6일
0

아무것도 모르고 뻘짓을 시작하다..

프론트(react)와 백엔드(springboot) 사이 각각의 역할을 정리하는 하는 것의 중요성을 느꼈다.


카카오 로그인 api 과정

이 부분이 서버에서 해줘야할 부분이다.

  1. 클라이언트로부터 인가 코드를 받는다.
  2. 받은 인가 코드로 카카오 서버에 엑세스 토큰을 요청한다.
    (이 때 Redirect URI는 프론트와 같아야 한다. 프론트 쪽에 맞추면 된다!)
  3. 발급받은 엑세스 토큰으로 카카오 서버에 유저 정보를 받아온다.
  4. 필요 시에 회원 가입을 진행한다.
    • DB에 없을 경우 : User 새로 생성 후 DB에 저장
    • DB에 이미 존재할 경우 : 다음 단계로 넘어가기
  5. 우리 사이트 전용 JWT 토큰을 발행한다.

공식문서를 보며 이해하자.

카카오 api 문서

공식문서를 보는 것에도 초반에 어려움이 있어 많은 블로그들을 참조하였다.
공식 문서의 개발 가이드를 보는 것도 처음인데, 이제야 조금 알것 같은 기분이다.


인가 코드 받을 때 사용

kauth.kakao.com/oauth/authorize?client_id={}&redirect_uri={}&response_type=code


인가코드로 발급받은 토큰을 사용하여 사용자 정보를 불러올때,
사용자 아이디로 DB에 저장을 할려고 한다.
이때, 사용자 아이디 변하지 않아 DB에 저장하고 조회할 수 있는지 궁금!!

공식 문서에 의하면 사용자 아이디가 고정된 상태라고 하며, DB에 저장하고 조회할 수 있다고 판단.

JWT(Json Web Token)란?

  • JWT는 Json 형식으로 되어있고, 디지털 서명이 되어 있다는 것
  • 서명 방식에는 HMAC, RSA, ECDSA가 있다.

JWT 구조

  • Header
  • Payload
  • Signature

JWT 가 최종적으로 띄는 형태는 왼쪽의 Encoded 부분
세 부분은 각각 base64 라는 통상적인 방식으로 인코딩된다.
또한 세 부분을 나누는 구분점 '.'이 있다.

  • Header : Signature 를 암호화한 알고리즘에 대한 정보, 해당 토큰의 타입 정보가 들어간다.

  • Payload : Claim 을 포함하는 부분이다. 클레임에는 등록된 클레임과 개인 클레임이 있다.
    + 등록된 클레임 : iss (발행자), exp (만료 시간), sub (제목), aud (청중) 등이 있지만 필수 요소는 아니다.
    + 개인 클레임 : 당사자 간에 정보를 공유하기 위해 생성된 맞춤 클레임이다. 우리는 이 개인 클레임에 사용자를 식별할 수 있는 id 값을 넣을 것이다.
    단, 해당 클레임에서 민감한 정보는 다루지 말아야한다. 앞서 말한 base64 방식은 복호화가 가능하기 때문에 누구에게나 노출될 수 있다.

  • Signature : 서명을 하는 방식은 간단하다. 앞서 만든 Header Payload(각각 base64 로 인코딩 된 상태) 에 자신의 Secret Key를 더해 Header에서 언급했던 방식으로 해싱을 한다. 그리고 그 값을 또 다시 base64 로 인코딩하면 된다.
    당연한 얘기지만 Secret Key는 어디에도 노출되면 안된다.😅 토큰의 유효성을 체크할 핵심 키이기 때문에 조심히 다뤄야 한다.

💥JWT는 사용자의 민감한 정보들을 전달하는 것 보다는 서명된 토큰 자체에 중점💥

토큰에 서명을 한 사람이 맞다면 가지고 있던 비밀 키로 복호화 할 수 있을 것이고, 그렇지 않다면 그건 위조되었거나 유효하지 않은 토큰이므로 서버로의 접근을 제한할 수 있다!


카카오 이메일 사용 시 주의 사항

  • 카카오로부터 제공받은 사용자 이메일 사용 시, 이메일과 함께 제공되는 이메일 유효 여부(is_email_valid)와 이메일 인증 여부(is_email_verified) 값으로 유효한 이메일인지 항상 확인해야 합니다. (OIDC: 사용자 정보 가져오기의 경우 email_verified)

  • 이메일 유효 여부 값이 false인 경우 이메일이 유효하지 않은 사용자에 해당하며, 해당 사용자의 이메일은 일부 마스킹(Masking)하여 제공합니다. (예: ka***@kakao.com) 이메일 인증 여부가 false인 경우, 인증되지 않은 이메일이므로 사용자에게 서비스에서 발송한 이메일이 올바르게 전송되지 않을 수 있습니다.

  • 또한 이메일은 사용자 요청에 따라 변경될 수 있으므로, 이메일을 ID로 사용하거나 이메일로 동일 사용자인지 확인하는 방식을 권장하지 않습니다.

즉, is_email_valid, is_email_verified 확인


여러 블로그들을 보면서 config에 CORS가 있길래 궁금하여 찾아보았다.

CORS?

https://wonit.tistory.com/307

CORS 해결 방안

https://wonit.tistory.com/572

참조
https://velog.io/@kimujin99/Spring-React-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%86%8C%EC%85%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-JWT-3

profile
Let's study!

0개의 댓글