구글로 로그인하기
, 페이스북으로 로그인하기
등의 버튼을 쉽게 볼 수 있음이 앱은 당신의 프로필에 접근하려 합니다.
등의 메세지를 띄움OAuth
를 이용OAuth 2.0
과 OpenID Connect
는 인증과 권한 관리를 위해 요즘 인터넷에서 가장 널리 쓰이고 있는 프로토콜들OAuth 2.0
은 권한 관리를 위해 사용OpenID Connect
는 인증을 위해 사용OAuth 2.0 인증
은 두 가지 플로우가 있는데, 서버사이드 어플리케이션을 위한 플로우와 브라우저를 베이스로한 앱을 위한 묵시적 플로우가 있음OpenID Connect
는 OAuth
를 권한에 대한 유즈 케이스들에 적합하게 만들기 위해 OAuth 2.0
프로토콜의 가장 상위 레이어에 있음OAuth
의 탄생을 이해하기 위해서는 위임 권한 부여(Delegated Authorization)라 불리는 용어를 알아야 함Tip! 서드파티란?
- 하드웨어 생산자와 소프트웨어 개발자의 관계를 나타낼 때 사용
- 그 중에서 서드파티(3rd Party)는 프로그래밍을 도와주는 라이브러리를 만드는 외부 생산자를 뜻함
- 편한 개발을 위해 플러그인이나 라이브러리 혹은 프레임워크를 사용하는데, 이처럼 제 3자로 중간다리 역할로 도움을 주는 것이 서드파티로 볼 수 있음
OAuth
를 이용해 서드파티 어플리케이션에게 사용자 데이터에 대한 접근 권한을 줄 수도 있음OAuth
(Open Authorization)은 위임 권한 부여를 위한 표준 프로토콜OAuth
는 어플리케이션이 사용자의 패스워드 없이 사용자의 데이터에 접근 가능하도록 허가구글로 로그인하기
, 페이스북으로 로그인하기
와 같은 버튼을 눌러서 시작구글로 로그인하기
버튼을 눌렀다면 사용자는 반드시 구글에게 로그인 자격을 제공해야 함account.google.com
과 같은 사이트에서 로그인하는 것을 말하며 클라이언트는 제공하지 않아도 됨OAuth
용어에서 스코프(scope
)라는 개념을 알면 이해 가능OAuth 2.0
에서 스코프(scope
)는 어플리케이션이 사용자 데이터에 접근하는 것을 제한하기 위해 사용scope
로 제한된 권한 인가권을 발행함으로써 데이터 접근을 제한scope
도 함께 보냄scope
의 리스트를 사용scope
에 제한된 토큰 또는 권한 부여 코드를 발행scope
가 설정되어 있기 때문OAuth
플로우에 대해 배워보기 전에 몇 가지 OAuth
설정에 대해 미리 알아두면 좋음response_type
scope
client_id
OAuth
세팅을 할 때 권한 부여 서버에 의해 제공됨OAuth
플로우를 시행하려는 클라이언트가 누구인지 알아내기 위해 사용redirect_url
OAuth
플로우가 끝나면 어디로 보내줄지에 대해 알려주는 역할client_secret
OAuth
플로우에서 이 파라미터는 필수 옵션은 아니지만 권한부여 코드 플로우에서 이 client_secret
의 중요성에 대해 알아볼 예정OAuth 2.0
플로우는 서버를 베이스로한 어플리케이션을 위한 권한 부여 코드 플로우와 순수한 자바스크립트 Single Page Application(SPA)을 위한 암묵적인 플로우가 있음OAuth
플로우로 여겨짐OAuth 2.0
매커니즘을 구현하기 위해서 프론트엔드 채널도 이용하고 백엔드 채널도 이용하기 때문code
라고 세팅된 response_type
과 함께 사용자를 권한 부여 서버로 리다이렉팅함으로써 권한 부여 시퀀스를 시작# google 예시: URI
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
client_id=your_client_id&
scope=profile%20contacts&
redirect_uri=https%3A//oauth2.example.com/code
scope
파라미터에 인자를 보냄으로써 사용자의 공개 프로필과 연락처에 접근할 수 있는 사용자의 권한을 요구# google 예시: 권한 부여 코드
4/W7q7P51a-iMsCeLvIaQc6bYrgtp9
response_type
을 code
로 세팅하는 것일까? OAuth
플로우의 보안성을 높게 만들기 위함client_secret
이 필요client_secret
은 클라이언트의 백엔드 채널에 의해서만 알려지게 되며 프론트엔드 채널은 client_secret
에 관여하지 않음client_secret
와 어플리케이션 코드를 동봉해서 보냄# google 예시: 요청
POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
code=4/W7q7P51a-iMsCeLvIaQc6bYrgtp9&
client_id=your_client_id&
client_secret==your_client_secret_only_known_by_server&
redirect_url=https%3A//oauth2.example.com/code
client_secret
과 어플리케이션 코드의 유효성을 검사하고 액세스 토큰을 전송OAuth 2.0
묵시적 플로우는 백엔드 채널이 존재하지 않으며 웹사이트가 브라우저만 사용하는 정적인 사이트일 때 사용response_type
이 token
으로 설정된 권한 부여 플로우를 시작하기 위해서 브라우저를 권한 부여 서버 URI로 리다이렉트OAuth
는 위임된 권한 부여 문제를 해결OAuth 2.0
은 권한 부여를 위한 것OpenID Connect
는 인증을 위한 것OpenID Connect
는 OAuth 2.0
프로토콜의 최상위 레이어와 동일한 레이어OpenID Connect
는 OAuth 2.0
을 확장하여 인증 방식을 표준화OAuth
는 유저 인증을 곧바로 제공하지 않지만 권한 부여를 위한 엑세스 토큰을 제공OpenID Connect
는 권한 부여 서버에 의해 작동하는 인증 시스템을 기반으로 클라이언트가 사용자를 판단할 수 있게 해줌openid
라는 scope
를 정의하면 OpenID Connect
사용이 가능openid
는 OpenID
가 필요되는 권한 부여 서버에 필수적인 scope
# google 예시: 요청
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
client_id=your_client_id&
scope=openid%20contacts&
redirect_uri=https%3A//oauth2.example.com/code
OAuth
플로우가 암묵적 플로우면 서버는 액세스 토큰과 ID 토큰을 바로 줄 것Tip! 추가 내용
- Access Token
- HTTP Request의 authorization 헤더에 넣은 토큰
- 일반적으로 JWT 형식을 많이 씀
- 토큰은 분실의 위험이 있기때문에 보통 30분-1시간의 유효기간을 가짐
- 어렵긴 하지만 서버에서 토큰을 취소하는 것이 불가능하진 않음
- Refresh Token
- 새로운 엑세스 토큰을 얻을 수 있는 장기 토큰
- 보통은 특정 리소스를 위한 엑세스 토큰을 얻음
- 리프레시 토큰을 안전하게 사용할 수 있는 클라이언트만이 리프레시 토큰을 사용해야 함
- ID Token
- 유저의 ID
- 일반적으로 JWT 형식
- ID 토큰은 절대 인증정보나 어떠한 리프레시 토큰 정보를 가지고 있으면 안됨
- 유저 ID는 단순하게 사용자를 구분하기 위해 사용함
header
, payload
, signature
3가지 부분이 담겨있는 인코드된 토큰payload
부분에 인코드된 사용자 정보를 얻을지 결정할 수 있음# google 예시: 사용자 정보
{
"iss": "https://accounts.google.com",
"sub": "10965150351106250715113082368",
"email": "johndoe@example.com",
"iat": 1516239022,
"exp": 1516242922
}
payload
는 claims
라 알려진 어떤 필드들을 포함claims
iss
: 토큰 발행자sub
: 사용자를 구분하기 위한 유니크한 구분자email
: 사용자의 이메일iat
: 토큰이 발행되는 시간을 Unix time으로 표기한 것exp
: 토큰이 만료되는 시간을 Unix time으로 표기한 것claims
는 이러한 영역에 제한된 것이 아님claims
를 인코드할 것인지에 달린 것OpenID Connect
scope
에 더 많은 것들을 기재하여 권한 부여 서버에게 ID 토큰의 payload
에 필요한 것들을 더 추가하라고 할 수 있음scope
는 email
, address
, phone
, profile
등이 있음Tip! 추가 내용
OpenID
도 인증을 위한 표준 프로토콜이고 HTTP를 사용한다는 점에서는 OAuth
와 같음OpenID
와 OAuth
의 목적은 다름OpenID
의 주요 목적은 인증(Authentication)이지만, OAuth
의 주요 목적은 허가(Authorization)OpenID
를 사용한다는 것은 본질적으로 로그인하는 행동과 같음OpenID
는 OpenID Provider
에서 사용자의 인증 과정을 처리하는데 Open ID
를 사용하는 여러 서비스(Relying Party)는 OpenID Provider
에게 인증을 위임하는 것OAuth
에서도 인증 과정이 있음OAuth
를 이용한다면 Facebook의 사용자인지 인증하는 절차를 Facebook(Service Provider
)이 처리OAuth
의 근본 목적은 해당 사용자의 담벼락에 글을 쓸 수 있는 API나 친구 목록을 가져오는 API 등 API를 호출할 수 있는 권한이 있는 사용자인지 확인하는 것OAuth
를 사용자 인증을 위한 방법으로 쓸 수 있지만 OpenID
와 OAuth
의 근본 목적은 다르다는 것을 알아야 함