글을 적으려고 찾아보니 OAuth 방식에도 여러가지가 있다 : OAuth Grant Types
그 중에서 가장 많이 사용되는 Authorization Code 방식의 OAuth flow에 대해 정리해보았다.
"인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준" - 위키백과
잘 와닿지 않는다. 쉽게 말해 특정 서비스 A를 이용하기 위해 직접 회원가입을 하지 않고, 다른 서비스 B의 계정을 이용해 로그인 할 수 있게 해주는 방법이다.
여기서 B는 Google이나 GitHub 같이 많은 사람들이 이미 가입해있는 Major Provider 이다.
실생활 예를 들자면, 배달의민족을 이용할 때 따로 회원가입을 하지 않고 Naver 계정을 이용해 로그인 할 수 있게 해주는 것도 OAuth 인증을 이용한 것이다.
OAuth 2.0은 1.0의 개선 버전으로, 구현이 더 쉬워졌다고 한다.(다행이다)
+----------+
| Resource |
| Owner |
| |
+----------+
^
|
(B)
+----|-----+ Client Identifier +---------------+
| -+----(A)-- & Redirection URI ---->| |
| User- | | Authorization |
| Agent -+----(B)-- User authenticates --->| Server |
| | | |
| -+----(C)-- Authorization Code ---<| |
+-|----|---+ +---------------+
| | ^ v
(A) (C) | |
| | | |
^ v | |
+---------+ | |
| |>---(D)-- Authorization Code ---------' |
| Client | & Redirection URI |
| | |
| |<---(E)----- Access Token -------------------'
+---------+ (w/ Optional Refresh Token)
RFC 6749: The OAuth 2.0 Authorization Framework
OAuth 로그인을 구현할 때 가장 많이 참고했던 그림이다. 하지만 한 뭉텅이로 설명되어 있어서 항상 헷갈렸다.
그래서 복습할 겸 그림을 하나하나 쪼개서 설명을 해보려한다.
여기서 Authorization Server는 가장 친숙한 GitHub로 정했다.
내 서비스에서 특정 Authorization Server 의 OAuth 로그인을 이용하기 위해 먼저 등록을 해야한다.
그러면 client_id 와 client_secrets를 발급받게 된다.
GitHub을 이용하는 경우 경우 Settings > Developer settings > GitHub Apps 에서 설정할 수 있다.
Provider 마다 등록 방법이 다르므로 검색해 보도록 하자.
GitHub 로그인
을 누르면 프론트에서 우리의 백엔드 서버로 GitHub 로그인을 하겠다는 요청을 전달한다.GET 서버주소/login/github
redirect 주소: GET https://github.com/login/oauth/authorize?client_id=클라이언트아이디&redirect_uri=리다이렉트주소...
우리서버주소/login/github/callback
)위 요청 주소는 마음대로 정하는게 아니라 GitHub에서 정한 양식이다. 이러한 양식들은 Provider 마다 다르고, 여기서는 OAuth 2의 대략적인 flow만 짚어보는 것이 목적이기 때문에 자세한 설명은 생략하겠다. GitHub를 이용할거라면 여기에서 확인해볼 수 있다.
code
가 전달된다GET 우리서버주소/login/github/callback?code=코오오오드
POST https://github.com/login/oauth/access_token
Accept: application/json
을 담아 보내면 JSON 형식으로 받을 수 있다.{
"access_token":"gho_16C7e42F292c6912bcbcbc7Ae178B4a",
"scope":"repo,gist",
"token_type":"bearer"
}
GET https://api.github.com/user
bearer 토큰값
" 와 같은 형태에 맞춰 토큰을 담아 요청한다.{
"login": "honeySleepr",
"id": 92678400,
"node_id": "U_kgDOBYYpAA",
"avatar_url": "https://avatars.githubusercontent.com/u/92678400?v=4",
...
}
https://api.github.com/users/깃헙아이디
를 통해 누구나 얻을 수 있는 정보이다)여기까지가 OAuth를 통한 사용자 인증 과정이다.
그럼 이제 이 사용자에게 다음 API 요청 때부터 사용할 수 있는 비밀 열쇠 같은 것을 만들어주면 된다.
이를 구현하는 다양한 방법들 중 내가 제대로 구현해본 것은 JWT를 이용하는 방법이다
JWT에 대해서는 다음 글에서 다뤄보도록 하겠다.
읽어주셔서 감사합니다🙇 피드백은 언제나 환영입니다~~
서버가 로그인 할 리다이렉트를 주고 code를 직접 받는 방식이군요!
잘봤습니다 BC 짱