OAuth 2.0 마스터 요약

2 분 소요

OAuth 란?

서로 다른 두 집단이 정보와 리소스를 안전하고 신뢰할 수 있는 방법으로 공유할 수 있게 해주는 프로토콜이다.

Oauth 2.0 인가 프레임워크

엄밀히 말해, OAuth 2.0 프로토콜은 인증 프로토콜이 아닌 인가(권한 부여) 프로토콜 이다.

OAuth 2.0 동작 흐름

사용자 동의

클라이언트 애플리케이션이 사용자 소유의 리소스에 어떤 행위를 하려면 먼저 그것을 위한 권한을 사용자에게 요청해야 한다.

그랜트

OAuth 2.0은 정보 교환을 위한 다양한 방법을 지원하고 그 방법에 따라 동작 흐름도 달라진다. OAuth 2.0에는 다음과 같은 유형의 Grant가 존재한다.

  • 인가 코드 그랜트 (Authrization Code Grant)
  • 암시적 그랜트 (Implicit Grant)
  • 리소스 소유자 비밀번호 작격증명 그랜트 (Resource Owner Password Credentials Grant)
  • 클라이언트 자격증명 그랜트 (Client Credentials Grant)

일반적으로 인가 코드 그랜트와 암시적 그랜트가 가장 많이 사용된다.

신뢰 vs 비신뢰 클라이언트

OAuth 2.0 클라이언트에는 두 가지 신뢰 레벨의 클라이언트만 있다. 신뢰 클라이언트 (Trusted Client)와 비신뢰 클아이언트 (Untrusted Client)다. 클라이언트의 신뢰 레벨은 두 가지 요소로 판단한다. 안전하게 정보를 저장하고 전송하는 능력이다.

  • 기밀 정보를 안전하게 저장하고 전송할 수 있는 밴엔드 서버사이에 존재하는 전형적인 3계층 클라이언트-서버-데이터베이스 애플리케이션은 신뢰 클라이언트에 해당한다.
  • 브라우저 기반의 애플리케이션 즉 HTML/자바스크립트 애플리케이션으로써 안전하게 저장해 주는 서버가 없을 경우 비신뢰 클라이언트에 해당한다.

액세스 토큰과 Bearer 토큰 액세스 토큰은 보호된 리소스에 접근할 수 있는 권한을 나타내는 문자열 값이다. Bearer 토큰은 단순히 액세스 토큰의 한 유형일 뿐이다. Bearer 토큰과 다른 유현의 액세스 토큰도 존재하지만 Bearer 토큰이 가장 많이 사용된다.

암시적 그랜트

클라이언트가 사용자의 보호된 리소스에 접근할때마다 반복해야 한다.

언제 암시적 그랜트를 사용해야 하는가?

사용자의 데이터를 오랜 기간 저장할 필요가 없는 순수한 브라우저 기반의 애플리케이션일때 사용한다.

비신뢰 클라이언트의 장단점

장점

  • 단순함: 직관적으로 설계됐기 때문에 구현이 매우 단순하다. 모든 동작이 웹 브라우저에서 일어나므로 백엔드 서버나 데이터 저장이 필요하지 않다.

    단점

  • 보안성이 낮다: 클라이언트 애플리케이션을 위한 키가 브라우저로 전달된다. 브라우저는 오픈되어 있으므로 다른 사람의 손에 키가 넘어갈 수 있다.
  • 단기간 접근만 가능: 비신뢰 클라이언트이기 때문에 오랜 기간 키를 저장할 수 없다. 이 때문에 사용자는 신뢰 클라이언트보다 더 자주 인증을 다시 받고 토큰을 재발급 받아야 한다.

Tip 암시적 그랜트 유형을 이용하려면 해당 애플리케이션이 읽기 전용 모드의 요청만 할 수 있도록 제한하는 것이 좋다. 그렇게 개발하면 누군가가 사용자의 키를 탈취하더라도 그 사람은 사용자 데이터를 수정할 수 없고, 단지 읽을 수만 있기 때문이다. (잠재적인 피해를 최소화 할 수 있다.)

인가 코드

클라이언트는 인증서버로 부터 인가 코드를 전달 받게되고 인가 코드를 액세스 토큰과 교환한다. 태그는 일단 한 번 사용된 이후에는 또 다른 액세스 토큰을 얻기 위해 재사용될 수 없다. 태그는 일회성이고 소모품이라고 말할 수 있다.

비신뢰 클라이언트와의 차이점

액세스 토큰이 브라우저에게 절대 전달 되지 않는다. 그렇기 때문에 액세스 토큰이 유출되거나 중간에 탈취될 위험섬이 감소된다.

언제 인가 코드 그랜트를 사용해야 하는가?

  • 클라이언트는 HTML/자바스크립트 애플리케이션이고, 서버는 SQL 데이터베이스 서버와 연동된 백엔드로 구성된 클라이언트/서버 애플리케이션
  • 서버와 연동해서 동작하는 네이티브 앱

신뢰 클라이언트의 장단점

장점

  • 더 안전하다: 키는 서비스 제공자와 서버 사이드의 클라이언트 애플리케이션 간에만 공유되고, 브라우저에는 전달되지 않기 때문에 키가 탈취될 가능성이 적어진다..
  • 장기간 오프라인 접근 가능: 클라이언트가 정보를 안전하게 저장할 수 있으므로 사용자의 데이터에 접근하기 위해 필요한 키 등의 정보를 저장해서 장기간, 심지어는 오프라인으로 접근할 수 있다.

    단점

  • 더 복잡하다: 안전하다는 장점을 이용하려면 좀 더 복잡한 키 교환을 가능하게 해주는 좀 더 복잡한 인프라가 필요하다.

요약

정보를 최대한 안전하게 교환하기 위해 클라이언트 애플리케이션의 신뢰 레벨을 판단하고, 해당 애플리케이션을 위한 알맞은 그랜트를 선택할 수 있어야 한다.

댓글남기기