POST /api/v1/oauthGET /api/v1/oauth/authorizePOST /api/v1/oauth/tokenPOST /api/v1/users/logout
OAuth 2.0의 Authorization Code Grant 형식의 인증을 사용함
- 로그인 버튼 클릭(
state생성) - (브라우저)
GET /signin/oauth(state전달) 페이지(로그인 폼 페이지)로 이동 - (브라우저) 사용자 정보를 입력받으면
POST /api/v1/oauth에 정보를 전송하고 서버로부터 HttpOnly 쿠키로incalo_sid(session_id)를 받음 - 정상적(200)으로 응답을 받았다면
GET /signin/oauth/consent(incalo_sid전송)페이지로 이동해 사용자에게 권한과 관련된 내용을 확인받음(2회차부터는 확인 없이 다음 단계로 넘어감) GET /api/v1/oauth/authorize페이지로 이동(302 Found 반환)- 이어서 초기에 지정한 리다이렉션 URI(
state전달)로 이동함(여기서state비교함) - URI의 쿼리스트링에서
code을 찾아POST /api/v1/oauth/token에 전송함(반환된access_token은localstorage에 저장) - 정상적(200)으로 응답을 받았다면 로그인이 완료된 것으로 간주
- 이제 API 사용 시
access_token는 자동으로 요청 헤더에 들어감
로그인 페이지
사용자에게 id와 password를 입력받아 POST /api/v1/oauth에 Ajax로 전송해 로그인을 시도한다.
로그인 성공(200 Ok)를 받았다면 GET /signin/oauth/consent으로 이동한다.
Query String Parameters:
response_type: (필수)code만 허용client_id: (필수) 클라이언트 식별자redirect_uri: (필수) 로그인 성공시 리다이렉트될 URIstate: (필수) CSRF 공격 보호용 값
개인정보 이용권한 동의 페이지
incalo_sid가 가리키는 사용자의 개인정보 이용권한 동의 상태를 확인한다.
만약 이미 허락한 상태라면, 자동으로 GET /signin/oauth/authorize 페이지로 리다이렉트(302 Found)한다.
개인정보 이용권한을 받지 않은 상태에서 GET /signin/oauth/authorize으로 이동하면 이용권한을 승인한 것으로 간주한다.
Query String Parameters:
response_type: (필수)code만 허용client_id: (필수) 클라이언트 식별자redirect_uri: (필수) 로그인 성공시 리다이렉트될 URIstate: (필수) CSRF 공격 보호용 값
Cookies:
incalo_sid: 로그인 세션 아이디
access_token 발급에 필요한 authorize_code를 전달하는 페이지
로그인 단계가 모두 잘 이루어졌다면 {redirect_uri}?code={authorize_code}으로 리다이렉트한다.
redirect_uri으로 돌아오면 브라우저는 authorize_code와 함께 받은 state가 처음 서버에 전달한 state와 같은지 확인한다.
Query String Parameters:
response_type: (필수)code만 허용client_id: (필수) 클라이언트 식별자redirect_uri: (필수) 로그인 성공시 리다이렉트될 URIstate: (필수) CSRF 공격 보호용 값
Cookies:
incalo_sid: 로그인 세션 아이디
id와 password로 로그인을 하고 incalo_sid를 HttpOnly 쿠키로 반환한다.
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
id=hello&password=1q2w3e4r
HTTP/1.1 200 Ok
Set-Cookie: incalo_sid=aaa.bbb.ccc; HttpOnly
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
Query String Parameters:
grant_type: (필수)authorization_code만 허용code: (필수) 최대 수명 10분의 일회용 인증 코드redirect_uri: (필수) 인증 코드를 받은 URIclient_id: (필수) 클라이언트 식별자
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token": "2YotnFZFEjr1zCsicMWpAA",
"token_type": "bearer",
"expires_in": 3600
}
access_token: (필수) 리소스 접근 토큰token_type: (필수) 토큰 종류(ex. Bearer)expires_in: (권장) 리소스 접근 토큰의 수명(초)