[Social login] 나는 왜 로그인기능에서 헤매고 있는가?(1)
로그인 기능에서 길을 잃었다.
kakao developer, next auth 이것저것 검색은 죄다 해보았는데..
하지만 난 이유를 알고있다.
바로 소셜 로그인 동작 원리와 데이터 처리 방법(로그인 정보 관리 등..)에 관한 내용들을 제대로 보지 않고 무작정 구현만 하려했기 때문이다.
(물론 구현도 못 했다)
1. 소셜 로그인은 대체 어떻게 동작하는데?
=> 2. 그래서 로그인 정보 가지고 뭐할건디?
공식문서를 참고하여 큰 그림을 그려가며 위 질문들에대한 답을 러프하게 정리해 볼 생각이다.
레츠고
본 내용에 들어가기에 앞서 필수 주요 용어들을 간단히 정리해보자.
Oauth 2.0 / Authentication(인증) / Authorization(인가) / Token & Session / Redirect / Authorization Code(인가코드 )
Oauth 2.0:
ex)
resource owner(User): "귀찮은데 카카오로 로그인 할래"
service server(Client): "카카오야 이것 좀 보고, 님들이 갖고 있는 쟤 이름이랑 사진 좀"
authorization server(Kakao api server): "ok.. 잠만요 확인점. 올 ㅇㅈㅇㅈ. 토큰도 드림요"
resource server(Kakao server): "유저 정본 여기어때~" => (사용자의 보호된 자원을 호스팅하는 서버)
Open authorization 2.0.
인증을 위한 개방형 표준 *프로토콜이다.
이 프로토콜에서는 third-party 프로그램에게 resource owner를 대신해서 resource server에서 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공한다.
구글, 카카오, 네이버, 깃헙 등에서 제공하는 간편 로그인 기능들이 이 Oauth2.0 프로토콜 기반의 사용자 인증 기능을 제공한다.
*프로토콜: 컴퓨터 간 데이터 교환 방식을 정의하는 규칙 체계 혹은 룰
▷Good to know
Oauth 개방형 표준 프로토콜의 탄생은 다음과 같은 문제에서 발생하였다.
기본 소셜로그인의 흐름(구글 예시)
1. 사용자가 서비스 웹에 구글 아이디와 비밀번호를 제공.
2. 서비스를 제공하는 서비스 웹이 해당 정보로 구글에 로그인.
3. 구글이 정보 제공.
4. 서비스 웹은 해당 정보를 가지고 사용자에게 서비스 제공.
이 로그인 흐름엔 큰 문제들이 있다.
1. 서비스웹이 해킹당하면 사용자들의 구글 계정 탈취 & 악용 가능성
2. 사용자들의 구글 계정 정보를 보관하고 있는 서비스웹에 부담
3. 구글도 믿을 수 없는 서비스웹에 사용자의 정보를 넘기는 것이 부담
=> 여러 기업들이 독자적 기술을 개발하였으나 표준화 x
=> 이를 해결하기 위해 Oauth 표준화 시작
Authentication(인증):
자원에 접근하기 위해 접근 할 수 있는 자격이 있는지 검증하는 단계
Authorization(인가):
자원에 접근 할 수 있는 권한을 부여하는 것.
authoriztion이 완료되면 서버에서 준 access token이 user에게 부여된다. 이 안에는 user의 자원에 접근할 수 있는 권한이 있다.
Token & Session:
token, session에 관해 내가 작성한 포스트인데 필요하면 다시 읽어보자.
https://bomramul.tistory.com/2
Redirect:
직역하면 다시 지시하다 라는 뜻이다.
예를 들어 브라우저가 www.somewhere.com/pageA 라는 곳으로 요청을 했다고 가정한다
그럼 서버는 http 응답 메시지에 www.somewhere.com/pageB로 다시 요청해봐 라고 브라우저에게 새로운 url로 "다시 지시"한다.
이것이 리다이렉트이다.
리다이렉트 된 페이지에서 service server(Client)는 인가코드를 받아 authorization server(Kakao api server)에 토큰 발급을 요청한다.
근데 이게 대체 왜 필요한지 궁금했다.
하필 저 url에 접속해야 인가코드를 주는 이유가 뭘까?
그 좋은 답이 아래 링크에 잘 설명되어 있다.
한마디로 사용자가 요청 후 리다이렉트를 시켜주지않으면 같은 요청을 재요청 할 수 있기 때문이다.(ex) 쇼핑몰 중복 주문, 게시물 중복 생성 등 .. )
참고: https://www.inflearn.com/questions/89530/redirect이유가-궁금합니다
Authorization Code(인가코드):
토큰을 받기 위한 코드.
인가코드 발급 과정을 찬찬히 보면 인가코드의 존재이유를 명확히 알 수 있다.
인가코드 발급 과정
1. 사용자가 서비스에서 카카오톡 로그인 버튼 클릭
2. 서비스가 카카오 인증 서버로 인가 코드 발급 요청
3. 카카오 인증 서버가 사용자에게 인증 요청("아이디 비번 입려하십쇼") => 카카오톡에 연결된 카카오 계정의 자격정보(credential)로 사용자 인증
4. 사용자 인증 성공 시 동의항목 설정 화면 출력
5. 사용자가 동의항목 체크하고 로그인 요청하면, 카카오 인증 서버가 서비스앱에 등록된 redirect uri로 인가코드 전달
6. 서비스는 전달받은 인가 코드로 카카오 인증 서버에 토큰을 요청하여 로그인 완료
이 후부턴 사용자가 서비스 이용 시 토큰 정보 조회 및 검증이 이루어진다
참고: https://developers.kakao.com/docs/latest/ko/kakaologin/common#intro-login-process
다음장에서 계속 됩니다.
참고
- https://velog.io/@cloud_oort/Next.js-소셜로그인