- 권한 부여 방식에 따른 프로토콜 종류 - 4가지
- Authorization Code Grant : 권한 부여 승인 코드 방식
- 권한 부여 승인을 위해 자체 생성한 Authorization Code를 전달하는 방식으로 많이 쓰이고 기본이 되는 방식
- 간편 로그인 기능에서 사용되는 방식으로 클라이언트가 사용자를 대신하여 특정 자원에 접근을 요청할 때 많이 사용
- 보통 타사의 클라이언트에게 보호된 자원을 제공하기 위한 인증에 사용된다.
- <그림 설명>
- 권한 부여 승인 요청 시 response_type을 code로 지정하여 요청
- 클라이언트는 권한 서버에서 제공하는 로그인 브라우저를 띄어 출력
- 해당 브라우저로 유저가 로그인을 하면 서버는 권한 부여 승인 코드 요청 시 전달 받은 redirect_url로 Authorization Code를 전달한다.
- 해당 Code를 권한 서버에서 제공하는 API를 통해 요청을 보내게 되면 Access Token이 발급
- Authorization Code Grant : 권한 부여 승인 코드 방식
- Implicit Grant : 암묵적 승인 방식
- 자격증명을 안전하게 저장하기 힘든 클라이언트(javaScript 등의 스크립트 언어)에게 최적화된 방식
- 권한 부여 승인 코드 없이 바로 Access Token 발급
- Access Token이 바로 전달 되므로 만료 시간을 짧게 하여 누출의 위험을 줄일 필요가 있음
- 이 방식에서 권한 서버는 client_secret를 사용해 클라이언트를 인증하지 않음
- Access Token을 획득하기 위한 절차가 간소화되어 응답과 효율성 높음
- Access Token이 URL로 전달되는 단점_보안 취약성
- <그림 설명>
- 권한 부여 승인 요청 시 response_type을 token으로 설정하여 요청
- 클라이언트는 권한 서버에서 제공하는 로그인 브라우저를 띄어 출력하여 로그인 완료
- 권한 서버는 Authorization Code가 아닌 Access Token을 redirectUrl로 전달
- Resource Owner Password Credentials Grant : 자원 소유자 자격증명 승인 방식
- username, password로 Access Token을 받는 방식
- 클라이언트가 타사의 외부 프로그램일 경우, 이 방식은 적용하면 안됨
- 자신의 서비스에서 제공하는 어플리케이션일 경우에만 사용되는 인증 방식
- <그림 설명>
- 제공하는 API를 통해 username, password를 전달하여 Access Token을 받는 방식
- 이 방식은 권한 서버, 리소스 서버, 클라이언트가 모두 같은 시스템에 속해 있을 때 사용되어야 하는 방식
- Client Credentials Grant : 클라이언트 자격증명 승인 방식
- 클라이언트의 자격증면만으로 Access Token을 획득하는 방식
- OAuth2의 권한 부여 방식 중 가장 간단한 방식
- 클라이언트 자신이 관리하는 리소스 혹은 권한 서버에 해당 클라이언트를 위한 제한된 리소스 접근 권한이 설정되어 있는 경우 사용
- 이 방식은 자격 증명을 안전하게 보관할 수 있는 클라이언트에서만 사용되어야 한다.
- 주요 API Parameter
- 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
- Access Token 획득 요청 시, 포함되는 값으로 권한 부여 방식에 대한 설정
- code
- Authorization Code Grant 방식에서 Access Token 요청 시 사용
- 권한 서버에서 획득한 Code 입력
- toekn_type
- 발행된 Token 타입
- 대표적으로 Bearer, MAC 등이 있다.
- expires_in
- 토큰 만료 시간(단위: 초)
- example_parameter
- Token 타입에 따른 추가 파라미터
- client_id, client_secret
- 권한 부여 승인 코드 방식_Authorization Code Grant
- 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
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
// Response
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
// Authorization Code 획득 후 해당 Code로 Access Token 획득
- 암묵적 승인 방식: Implicit Grant
// 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이 바로 전달되는 방식
- 자원 소유자 자격증명 승인 방식: Resource Owner Password Credentials Grant
// 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 or password를 통해서 Access Token 발급
- 클라이언트 자격증명 승인 방식: Client Credentials Grant
// 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 획득
출처: https://blog.naver.com/mds_datasecurity/222182943542
'배움 기록_실무 ✏️' 카테고리의 다른 글
AWS Database Migration Workshop (1) | 2022.05.25 |
---|---|
구글 OAuth2 인증 방식 (0) | 2022.03.29 |
쿠팡 파트너스 API 연동 (2) | 2022.02.28 |
Spring batch 개발 (4) | 2022.02.10 |
JWT에 대해서 (1) | 2022.01.10 |