배움 기록_실무 ✏️

OAuth 동작 방식

j_estory 2022. 3. 29. 21:51
  • 권한 부여 방식에 따른 프로토콜 종류 - 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로 전달

Authorization Grant : Implicit

  • Resource Owner Password Credentials Grant : 자원 소유자 자격증명 승인 방식
    • username, password로 Access Token을 받는 방식
    • 클라이언트가 타사의 외부 프로그램일 경우, 이 방식은 적용하면 안됨
      • 자신의 서비스에서 제공하는 어플리케이션일 경우에만 사용되는 인증 방식
    • <그림 설명>
      • 제공하는 API를 통해 username, password를 전달하여 Access Token을 받는 방식
      • 이 방식은 권한 서버, 리소스 서버, 클라이언트가 모두 같은 시스템에 속해 있을 때 사용되어야 하는 방식

Authorization Grant: Password

  • Client Credentials Grant : 클라이언트 자격증명 승인 방식
    • 클라이언트의 자격증면만으로 Access Token을 획득하는 방식
    • OAuth2의 권한 부여 방식 중 가장 간단한 방식
    • 클라이언트 자신이 관리하는 리소스 혹은 권한 서버에 해당 클라이언트를 위한 제한된 리소스 접근 권한이 설정되어 있는 경우 사용
    • 이 방식은 자격 증명을 안전하게 보관할 수 있는 클라이언트에서만 사용되어야 한다.

Authorization Grant: Client Credentials

 

  • 주요 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
    • code
      • Authorization Code Grant 방식에서 Access Token 요청 시 사용
      • 권한 서버에서 획득한 Code 입력
    • toekn_type
      • 발행된 Token 타입
      • 대표적으로 Bearer, MAC 등이 있다.
    • expires_in
      • 토큰 만료 시간(단위: 초)
    • example_parameter
      • Token 타입에 따른 추가 파라미터

 

  • 권한 부여 승인 코드 방식_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

 

OAuth 2.0 동작 방식의 이해

OAuth 2.0(Open Authorization 2.0, OAuth2)은 인증을 위한 개방형 표준 프로토콜입니다. 이 프로토...

blog.naver.com

 

'배움 기록_실무 ✏️' 카테고리의 다른 글

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