OAuth2는 서비스 개발자가 ‘GSA 통합 계정으로 로그인’에서 제공하는 데이터를 사용하여 인증을 구현할 수 있도록 해줍니다. 이미 지글은 ‘GSA 통합 계정으로 로그인’을 사용해서 인증 과정을 제공하고 있습니다. ‘GSA 통합 계정으로 로그인’에서는 authorization code grant
, implicit grant
두 가지의 OAuth2 flow를 제공하고 있습니다. 또한 OIDC를 지원하기 때문에 access_token
외에도 id_token
을 발급받아서 활용할 수 있습니다. id_token
을 사용하는 경우에는 /oauth2/userinfo
를 통한 유저 정보 확인이 필요하지 않습니다.
OAuth2를 구현하기 위해서는 제일 먼저 client를 등록 하고 client ID와 client secret을 얻어야 합니다. 그리고 OAuth2를 사용하기 위해서 각 언어에 맞춰 만들어진 여러 라이브러리들을 사용할 수 있습니다. OAuth2를 라이브러리 없이 사용하기 위해서는 RFC 6749을 참고해주세요. ‘GSA 통합 계정으로 로그인’에 client를 등록했으면 client_id
와 client_secret
을 준비하고 목적에 따라 어떤 OAuth2 flow가 맞는지 확인할 차례입니다.
‘GSA 통합 계정으로 로그인’은 OpenID Connect에서 제공하는 표준을 만족하기 때문에 모든 과정에서 OAuth2외에도 OIDC용 인증된 라이브러리를 사용할 수 있습니다.
또한 모든 정보는 아래 URL에서 확인할 수 있습니다.
<https://api.idp.gistory.me/.well-known/openid-configuration>
URL | 설명 |
---|---|
https://idp.gistory.me/authorize | Base authorization URL |
https://api.idp.gistory.me/oauth2/token | Token URL |
https://api.idp.gistory.me/oauth2/revoke | Token Revocation URL |
RFC 표준에 따라서 token URL과 token revocation URL에서는 content type을 application/x-www-form-urlencoded
로 하여 요청을 보내야 합니다.
Scope | 설명 |
---|---|
openid | 필수 scope입니다 |
offline_access | Refresh Token을 발급할 수 있습니다. consent prompt가 필수적입니다. |
profile | 유저 정보에서 이름(name / user_name )을 확인할 수 있습니다 |
유저 정보에서 이메일(email / user_email_id )을 확인할 수 있습니다 |
|
phone | 유저 정보에서 전화번호(phoneNumber / user_phone_number )을 확인할 수 있습니다 |
student_id | 유저 정보에서 학번(studentid )을 확인할 수 있습니다 |
id_token과 userinfo URL에서 반환하는 유저 정보 필드 명이 다른 경우 구분하여 표시했습니다.
‘GSA 통합 계정으로 로그인’을 사용할 때 보안을 강화하기 위해서 state
파라미터와 nonce
파라미터를 사용할 수 있습니다. Cross-site request forgery(CSRF)나 Clickjacking은 OAuth2를 사용하여 인증을 구현할 때 일어날 수 있는 보안 취약점들입니다. 이들은 state
파라미터와 nonce
파라미터를 사용해서 해결할 수 있습니다. state
를 authorization 요청 시 보내면 응답으로 같은 값이 돌아오게 되고, id_token
요청 시에 nonce
를 보내면 id_token
에 해당 필드가 같이 들어갑니다. 이러한 값으로는 유저 세션 쿠키의 해시 값이나 유저 세션과 연관 되어있는 다른 임의 값을 사용할 수 있습니다.
클라이언트에서 인증 과정을 시작할 때 고유한 state
를 생성하고 해당 값을 클라이언트만 접근할 수 있는 곳에 저장합니다 (same-origin policy에 의해 보호 될 수 있는 영역). 인증에 대한 응답이 돌아오면 state
파라미터의 값이 저장된 값과 일치하는지 확인합니다. 일치하는 경우 유효한 인증 요청인 것이며, 일치하지 않는 경우 제3자에 의해 변조되었거나 유효한 경로를 통해서 인증한 것이 아니기 때문에 해당 인증 요청을 거부하여야 합니다.
‘GSA 통합 계정으로 로그인’에서 state
파라미터의 사용은 필수사항이 아니지만, 여러분의 서비스와 데이터를 보호하기 위해서 사용할 것을 권장합니다.
authorization code grant는 access code를 받아서 유저의 access token과 교환하는 OAuth2의 가장 대표적인 flow입니다. 인증 서버가 클라이언트와 소유자의 중간 역할을 하게 되며, 소유자의 인증 정보는 클라이언트에 직접적으로 공유되지 않습니다.
OAuth2 엔드포인트의 모든 요청은 HTTP Basic 인증 또는 form data body의 client_id
와 client_secret
을 필요로 합니다.