전부 서비스가 구글의 아이디와 패스워드를 직접 관리하기 때문에 발생하는 일
요약하자면 인증은 유저가 직접, 권한은 서비스에게
access_token
을 발급하는 것이다.response_type=code
로 지정하여 요청하고, 클라이언트는 권한 서버에서 제공하는 로그인 페이지를 브라우저를 띄워 출력함.redirect_url
로 Authorization Code
를 전달하고, Authorization Code
는 권한 서버에서 제공하는 API를 통해 Access Token
으로 교환된다.client_secret
를 사용해 클라이언트를 인증하지 않는다.Access Token
을 획득하기 위한 절차가 간소화되기에 응답성과 효율성은 높아지지만 Access Token
이 URL로 전달된다는 단점이 있다. (토큰 탈취 위험 증가)response_type
을 token
으로 설정하여 요청 이후 클라이언트는 권한 서버에서 제공하는 로그인 페이지를 브라우저를 띄워 출력하게 되며 로그인이 완료되면 권한 서버는 Authorization Code
가 아닌 Access Token
를 redirect_url로 바로 전달함.Refresh Token
사용 가능Access Token
을 획득하는 방식입니다. 즉 클라이언트 자체가 사용자의 대신으로 Access Token
을 획득한다.API Parameter | description | value |
---|---|---|
client_id, client_secret | 클라이언트의 자격증명 클라이언트가 권한 서버에 등록하면 발급받을 수 있으며 권한 서버 연동 시 클라이언트 검증에 사용됨 | |
redirect_url | 권한 서버가 요청에 대한 응답을 보낼 url을 설정 | |
response_type | 권한 부여 동의 요청 시 포함되는 값으로 권한 부여 방식에 대한 설정 | code: Authorization Code Grant, token: Implicit Grant |
state | CSRF 공격에 대비하기 위해 클라이언트가 권한서버에 요청 시 포함하는 임의의 문자열. 필수 사항은 아니지만 클라이언트가 요청 시 state를 포함 시켰다면 권한 서버는 동일한 값을 클라이언트에게 보내야 함 | |
grant_type | Access Token 획득 요청 시 포함되는 값으로 권한 부여 방식에 대한 설정 | authorization_code: Authorization Code Grant, password: Resource Owner Password Credentials Grant, client_credentials: Client Credentials Grant |
code | Authorization Code Grant 방식에서 Access Token요청 시 사용됩니다. 권한 서버에서 획득한 Authorization Code를 입력 | |
token_type | 발행된 Token의 타입. 대표적으로 Bearer, MAC(Message Authentication Code)가 있다. | |
expires_in | 토큰 만료 시간 (단위: 초) | |
example_parameter | Token 타입에 따른 추가 파라미터 |
base64(client_id:client_secret)
# Step 1. Authorization
Request (GET)/authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fc
Response: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
# Step 2. Access Token
Request (POST) /token
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
Response
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
Authorization Code 획득 후 해당 Code로 Access Token 획득
Request (GET)/authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
Response http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=example&expires_in=3600
Authorize 요청 시 url로 Access Token이 바로 전달됨
Request (POST) /token
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=johndoe&password=A3ddj3w
Response
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
Username, Password로 Access Token 획득
Request (POST) /token
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
Response
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"example_parameter":"example_value"
}
클라이언트 자격증명만으로 Access Token 획득