티스토리 뷰
체크인 사이트에서 로그인을 할 때 42 인트라 아이디와 비밀번호를 사용한다.
제일 처음에는
- 접속하려는 아이디가 인트라에 등록된 아이디인지 판단해야 한다.
- 비밀번호가 일치해야 한다.
라는 요구사항을 만족하려면
1. 42 API에서 회원정보를 전부 받아와서 내 db에 저장을 해서 로그인 요청마다 db에서 find를 한다.
라고 생각을 했었다. 그래서 user 테이블을 따로 만들어 ID, PW 등을 저장하는 방식으로 그림을 그렸다.
하지만 그 후, 2. 비밀번호는 나한테 없는데 어떻게 확인을 하지 ...?
2번에서 막혀서 생각이 진전되지 않아 실제 체크인사이트에서 로그인이 실행되는 과정을 살펴보았다.
인트라에 접속하지 않았을 경우 체크인사이트에서 로그인 페이지로 넘어가고, 인트라에 접속이 되어 있는 경우 로그인 페이지가 생략되고 다음 단계로 진행되었다. 이 때 로그인 과정(아이디, 비밀번호 체크 등)은 내가 구현하는 것이 아니라 인트라에서 담당한다는 것을 깨달았다.
또한 42 API에서 회원정보를 전부 받아오는 과정에도 권한이 필요했고, OAuth라는 키워드를 알게 되었다.
OAuth
OAuth에는 네 개의 주체가 등장한다.
- 클라이언트: 내가 만들어서 제공하는 서비스
- 리소스 주인: 유저
- 리소스 서버: 실제로 유저정보(리소스)를 관리하는 서버(42, Google, Naver...)
- 권한 서버: 클라이언트에게 토큰을 발급하는 서버
애플리케이션을 리소스 서버에 등록하기 (클라이언트가 리소스 서버의 승인을 받는다)
- 인트라 프로필->Settings->API 에서 REGISTER A NEW APP을 클릭한다. 아래는 필수사항
- Name : 앱의 이름.
- Redirect URI: 유저가 42 인증에 성공 했을 때 리다이렉트 되는 주소. (후에 해당 url의 파라미터로 유저의 code가 발송된다.)
- 제출 후 API를 누르면 내가 만든 애플리케이션을 확인할 수 있다.
- UID : 클라이언트 아이디 (공개된다)
- SECRET : 클라이언트 비밀번호 (외부로 공개되지 않는다)
애플리케이션에서 OAuth 권한 부여 흐름 구현하기
- 유저가 클라이언트에게 권한을 승인한다. (그림에서 1번)
- 유저가 본인의 42 정보를 다른 애플리케이션에서 사용할 수 있도록 애플리케이션에게 권한을 부여해야 한다. 권한 부여 후 코드가 발급된다.
- 유저를 인증 페이지로 보내 인증을 하도록 한다 (주소 : 권한서버/client_id=...&redirect_uri=...&response_type=...)
- client_id : 서버가 클라이언트를 식별하는 데에 필요
- redirect_uri : 해당 파라미터로 유저의 code가 발송된다
- response_type: 42가 인증코드를 리턴하기 때문에, 값은 code로 지정
- 42에서는 해당 주소가 회색 박스에 구현되어 있고, "Try this url" 버튼만 누르면 인증 페이지로 넘어간다
- 유저가 코드를 받는다
- 유저가 인증을 하면, 42가 권한 결정에 대한 코드를 미리 지정된 redirect_uri로 보낸다. (주소: 리다이렉트uri/?code=...)
- 날아오는 파라미터 code에 대한 값을 확인한다.
- 받은 코드를 이용해 클라이언트가 액세스 토큰을 요청한다 (그림에서 2번)
- Base url = https://api.intra.42.fr/oauth/token
- grant_type = 값으로 authorization_code 지정
- code = 유저가 받은 코드
- client_id = UID (42에서 제공)
- cliend_secret = SECRET (42에서 제공)
- redirect_uri = 앞에서 사용한 것과 같은 리디렉션 url
- scope = 값으로 public, profile 등 지정 (42에서 제공)
- 클라이언트가 액세스 토큰을 받는다.
- 요청에 대한 응답으로 토큰이 날아온다
- 클라이언트가 토큰을 사용해서 사용하고 싶은 API를 호출해서 응답을 받는다 (그림에서 3번)
- Authorization = "Bearer" + " " + 토큰
- 유저가 권한을 새로 부여할 때마다 새로운 코드, 새로운 토큰이 사용된다.
'프로젝트' 카테고리의 다른 글
프로젝트 회고 (0) | 2021.11.28 |
---|---|
AWS - 클라우드 서버 구조 분석 (0) | 2021.10.07 |
AWS - VPC 관련 (0) | 2021.10.06 |
URL Shortener - DB 인덱스 (0) | 2021.10.01 |
42체크인 DB 설계 – 정규화와 역정규화 (0) | 2021.09.29 |