2021-03-15(Mon)
항목 | 내용 |
학습 날짜 | 2021-03-15(월) |
학습 시간 | 11:00~24:00 |
학습 범위 및 주제 | OAuth |
학습 목표 | 트렌센더스 제출전 마지막 체크리스트를 모두 클리어한다. |
동료 학습 방법 | eunhkim, sanam, jujeong, yohlee와 페어 프로그래밍 |
상세 학습 내용
OAuth를 다시 활성화시켰는데 우리 발목을 잡는다. 다시 개념을 되새겨보자.
OAuth2
실제 비밀번호 대신 AccessToken
이라는 일종의 비밀키를 이용한다.
AccessToken의 장점
사용자의 실제 비밀번호가 아니다.
서비스의 모든 기능이 아닌 일부 기능만 이용 가능한 토큰이다.
OAuth는 다른 서비스로부터 AccessToken을 얻어내는 기술이다.
OAuth 인증을 위해 필요한 객체
User(Resource Owner): 리소스의 주인(일반 사용자)
App(client): 제 3자 앱. User가 사용하는 서비스
Auth server / Resource server (ex. Google, 42api, github, facebook etc)
Resource server: 리소스 저장 서버. API를 통해 리소스를 제공
Authorization server: 인증 담당 서버: 인증을 완료하면 access token을 client에게 보낸다.
리소스 서버와 인증 서버는 같은 서버일 수도 있다.
일반적으로 구글이나 페이스북 같은 대규모 서비스에서는 리소스 서버와 인증 서버를 분리한다.
OAuth 로그인을 위해 필요한 요소
OAuth 로그인을 하고자 하는 서비스에서 아래 세 가지 요소를 받아야 한다.
Client ID: public key 이다. 공개해도 된다.
Client Secret: secret key이다. 공개하면 안 된다. 보통 환경변수에 담아 둔다.
Redirect URL: Client ID와 Client Secret을 확인한 후 redirect할 url 주소이다.
OAuth 인증 과정
전제
Client가 Auth Server로부터 Client ID, Client Secret, Redirect URL을 모두 등록/발급 받은 상태여야 한다.
Resource Owner의 승인
Resource Owner가 Auth Server에게 승인 요청을 보낸다.
Auth Server가 Resource Owner에게
Authorization Code
를 보낸다.이제 Resource Owner가 Client에게
Authorization Code
를 보낸다.Client는
Client ID, Client Secret, Redirect URL, Authorization Code
네 가지를 모두 갖고 있는 상태이다.
Auth Server의 승인
위 네 가지 정보를 Auth Server에 보낸다. (Redirect URL은 optional)
redirect_url
을 보내는 건 선택이다.하지만
Client ID, Client Secret, Authorization Code 세 가지는 꼭 보내야 한다.
Resource Server는 네 가지 정보가 모두 일치하는지 확인한다.
하나라도 불일치 할 경우 OAuth 로그인은 실패한다.
모두 일치하면
Access Token
을 발급한다.Authorization Code
값은 더 이상 필요없기 때문에 삭제한다.
Access Token 발급
발급 받은
Access Token
을 통해서 Resource Server의 기능을 이용할 수 있다.
Refresh Token
Access Token
은 cookie처럼 만료 기한이 있다.따라서 만료가 되면 재발급 받아야한다.
이 때 사용하는 게
Refresh Token
이다.서비스마다
Refresh Token
을 발급하지 않는 경우도 있고 쓰는 방식도 다르다.Access Token
은 주로 세션에 저장한다.만료 기한이 짧다.
Refresh Token
은 중요하기 때문에 DB에 저장한다.만료 기한이 길다.
우리 프로젝트에서는 아래 관계이다.
Resource owner: User
Resource server: 42 api server
Client: Rails server
참고
https://ruby-doc.org/stdlib-2.7.2/libdoc/net/http/rdoc/Net/HTTP.html
https://api.intra.42.fr/apidoc/guides/web_application_flow
https://medium.com/@charmiigarg/apigee-introduction-to-oauth-2-0-grant-types-4352aa7aacf7
학습 내용에 대한 개인적인 총평
Authorization code
는 잘 받았고, 42api 서버에 Authroization code
를 보냈는데 Access Token
이 제대로 돌아오지 않았다. 흠 알고보니 42api 문서에 제대로 명시되지 않은 숨겨진 규칙들이 있어서 그런 것이었다. 가령 required 라고 적혀있지 않은 key 값이 사실은 required 라든지.. api 문서가 제대로 적혀있지 않아서 생긴 문제 덕에 시간을 많이썼다. 문서 관리의 중요성을 깨달을 수 있었다.
다음 학습 계획
트렌센더스 테스트
Last updated