2022. 4. 5. 16:28ㆍCloud Native
- 목차
Open Authorization 2.0
인증을 위한 개방형 표준 프로토콜
3rd party 프로그램에서 resource 소유자를 "대신" 하여 접근 권한을 위임
구글, 카카오, 네이버 등에서 OAuth2 기반의 인증 기능을 제공
기본 용어
| Authentication (인증) | 접근 권한 자격 검증 과정 |
| Authorization (인가) | 권한 부여 과정 |
| Access Token | 리소스 서버의 자원 획득 시 사용하는 token (만료 기간 존재) |
| Refresh Token | Access Token 만료 시 이를 갱신할 때 사용하는 token 즉, refresh token의 만료 기간이 access token 보다 길게 설정됨 |
역할
| Resource Owner (User) | 리소스 소유자 자원 접근 권한 부여자 client에 대한 인증 수행 후 Authorization Grant(인증 획득 자격)을 부여 개념적으로는 리소스 소유자가 자격을 부여하나 실제로 OAuth2에서는 권한 서버가 중간에서 client와 리소스 소유자 간 중개 역할을 수행 |
| Client | 자원 접근 요청자 |
| Resource server | 자원 제공자 |
| Authorization Server | 인증/인가를 수행 후 client에게 access token 발급(권한 부여) |
과정
1. Authorization Code Grant (권한 부여 승인 코드 방식)
기본 방식으로 client app이 사용자를 대신해 자원에 접근 요청 시 사용됨
refresh token 사용 가능
- 사용자(resource owner)가 client app을 실행
- client app은 Authorization server에 'authorization code grant(권한 부여 승인 코드)' 요청 <- (1) 코드 요청 (GET)
- 요청 params:
- response_type=code
- 요청 params:
- client app은 authorization server가 제공하는 log-in page를 browser를 사용해 출력
- 사용자는 이를 통해 log-in 수행
- authorization server가 client app에 "권한 승인 코드" 전달
- client는 redirect_url도 받음
- client app은 authorization server에 "access token" 요청 <- (2) Access Token 요청 (POST)
- 요청 params:
- client_id, client_secret, redirect_url
- grant_type=authorization_code
- code (authorization code는 access token으로 교환됨)
- 요청 params:
- authorization server는 client에 access token 전달
- client app은 access token을 가지고 resource server에 자원 요청
- resource server는 client에 자원 전달
authorize
GET 방식
request ex.
authorize?response_type=code&client_id=dh3r3j3445jk&state=dfhj&redirect_uri=https%2B%1A%2Esome...1
response ex.
https://some.com?code=Sjehkfuea44s&state=dfhj
client_id와 client_secret은 Base64 encoding하여 사용
request (access token)
POST 방식
request
Authorization: Basic dfhj121232fjdkjfzvzjhjdnzdikj34
Content-type: application/x-www-form-urlencoded
grant_type=authorization_code&code=Sjehkfuea44s&redirect_uri=https%2B%1A%2Esome...2
response
{
"access_token":"3aktnefaFEjr1zCsicaepAz",
"token_type":"some",
"expires_in":3600,
"refresh_token":"fgh1212fnzvxk3u9fzjhzkzQ",
"example_parameter":"some_value"
}
2. Implicit Grant (암묵적 승인)
자격증명을 안전히 저장할 수 없는 client에서 사용하는 방식
e.g., JavaScript 등의 코드로 동작하는 client
권한부여승인코드 없이 바로 "Access Token"이 발급됨
- 만료기간을 짧게 설정하여 누출의 위험을 줄여야 함
- refresh token 사용이 불가능
client_secret으로 client를 인증하지 않음
access token이 URL로 전달됨
- 사용자(resource owner)가 client (app)에 사용 요청
- client app은 authorization server에 접근권한 요청
- params:
- client_id, redirect_url
- reponse_type=token
- log-in page를 반환
- params:
- client는 log-in을 수행
- authorization server가 access token 제공
- client는 access token으로 자원 획득
authorize
GET 방식
request ex.
authorize?response_type=token&client_id=dh3r3j3445jk&state=dfhj&redirect_uri=https%2B%1A%2Esome...1
response ex.
https://some.com/cb#access_token=1Bsdu311hjfhkvadh&state=lkn&token_type=some&expires_in=3600
authorize 요청 시 바로 access token 전달
3. Resource Owner Password Credentials Grant (자원 소유자 자격증명 승인 방식)
uesrname, password로 Access Token을 전달 받음
client가 외부 프로그램인 경우 사용
refresh token 사용 가능
- user가 client에 사용 요청
- params: username, password
- client는 Authorization server에 "access token" 요청
- params: client_id, grant_type=password
- username
- password
- client는 access token을 전달받아 자원 획득에 사용
request (access token)
POST 방식
request
Authorization: Basic dfhj121232fjdkjfzvzjhjdnzdikj34
Content-type: application/x-www-form-urlencoded
grant_type=password&username=tommy&password=eyyerbz00a
response
{
"access_token":"3aktnefaFEjr1zCsicaepAz",
"token_type":"some",
"expires_in":3600,
"refresh_token":"fgh1212fnzvxk3u9fzjhzkzQ",
"example_parameter":"some_value"
}
4. client Credentials Grant (클라이언트 자격증명 승인 방식)
User 개입 없이 client의 자격증명만으로 Access Token을 획득
client에 대한 제한된 resource 획득에 사용됨
자격 증명을 안전히 보관할 수 있는 client만 사용
refresh token 사용 불가
- client는 authorization server에 "access token" 요청
- params: grant_type=client_credentials
- client는 access token을 전달 받아 자원 사용에 활용
request (access token)
POST 방식
request
Authorization: Basic dfhj121232fjdkjfzvzjhjdnzdikj34
Content-type: application/x-www-form-urlencoded
grant_type=client_credentials
response
{
"access_token":"3aktnefaFEjr1zCsicaepAz",
"token_type":"some",
"expires_in":3600,
"example_parameter":"some_value"
}
refresh token이 없음
'Cloud Native' 카테고리의 다른 글
| Open Telemetry (0) | 2022.10.07 |
|---|---|
| TPS (Transaction Per Second) (0) | 2022.10.07 |
| REST API (0) | 2022.03.01 |
| Kafka, RabbitMQ, GCP pub/sub (0) | 2022.02.27 |
| Chat System (0) | 2022.02.27 |