OAuth 2.0 톺아보기
안녕하세요 😉
유유자적한 개발자 유로띠 입니다 😀
오늘은
OAuth 2.0
톺아보기(샅샅이 더듬어 살피다)
입니다.
OAuth
✅ OAuth란?
OAuth는 Open Authorization의 줄임말로 OAuth는 인터넷에서 서비스 및 애플리케이션 간에 사용자 정보를 안전하게 공유하기 위한 표준입니다.
✅ 등장 배경
OAuth 등장 전에는 제공 업체의 id / password를 통해 신원이 확실치 않은 third party에 직접 로그인을 했기 때문에 보안적으로 위험했고, third party 입장에서는 제공받은 정보를 안전하게 보호해야 했기 때문에 부담이 있었습니다.
2006년 11월 당시 Twitter 개발자인 Blaine Cook(블레인 쿡)은 트위터에 OpenID를 탑재하는 작업을 하고 있었습니다.
같은 시기, 소셜 북마크 사이트인 Ma.gnolia는 회원이 OpenID를 사용하여 대시보드 위젯으로 서비스에 접속할 수 있는 인증 방법을 필요로 하고 있었습니다.
그래서 쿡과 해시태그를 창안한 Chris Messina (크리스 메시나), Larry Halff (래리 하프)는 당시 verisign개발자 David Recordon (데이비드 리코던)과 만나 OpenID를 활용해 트위터나 Ma.gnolia의 API로 인증을 위임하는 방법을 논의했습니다.
그 결과, API 접근 위임에 대한 공개 표준이 아직 존재하지 않는다는 결론에 이르렀습니다.
2007년 4월 OAuth 커뮤니티가 탄생하였고 그해 7월 OAuth 초안이 완성되고 10월에 OAuth core 1.0 최종 초안이 발표되었습니다.
그 후 2008년 11월 미네소타에서 열린 제73회 IETF 모임에서 OAuth 표준안이 논의되었습니다.
그리고 드디어 2010년 IETF에서 OAuth 1.0 공식 표준안이 RFC5849로 발표되었습니다.
✅ OAuth 참여 주체
OAuth의 참여 주체는 User, Server, IdP 3가지로 나뉩니다.
User 또는 resource owner로 불리며 서비스를 사용하는 사용자입니다.
Server 또는 client로 불리우며 사용자가 접근하기 원하는 서비스(애플리케이션)입니다.
IdP는 Identity Provider의 줄임말이며, resource Server로 불리우며 사용자의 자격증명을 확인하거나 서비스에게 인가(Authorization) 역할을 합니다.
✅ OAuth 동작방식
간단한 OAuth flow입니다. (참고로 해당 flow는 excalidraw로 작성하였고 이전글을 참고하시면 됩니다.)
옵시디언에서 excalidraw로 손그림 다이어그램 그리기
1. 유저는 접근 데이터를 요청합니다.
2. 서버는 유저에게 로그인을 통해 Idp 본인 인증을 요청합니다.
3. 유저는 Idp에 로그인을 통한 신원 인증을 진행합니다.
4. Idp는 사용자의 권한을 확인하고 접근 토큰을 전달합니다.
5. server는 사용자의 인증 토큰을 검증했음을 확인합니다.
OAuth 2.0
✅ OAuth 2.0 이란?
간단히 설명하면 OAuth 1.0의 단점과 문제점을 보완했다고 보면 됩니다.
OAuth1.0은 보안에 위험이 있고 사용 절차가 복잡했습니다. 또한 애플리케이션에서는 사용하기가 곤란하였습니다.
그래서 OAuth 2.0에서는 단점과 문제점을 다음과 같이 보완하였습니다.
🔵 Scope 추가
기존 OAuth 1.0에서는 토큰이라는 인가를 위한 값만 있으면 사용자의 모든 리소스에 접근이 가능하였습니다.
OAuth 2.0에서는 scope가 추가되어 발급받을 토큰에 대해서 얼마만큼의 접근 범위를 인가할지 정할 수 있습니다.
🔵 보안 강화 및 편의성
기존 OAuth 1.0의 인증 방식은 수많은 매개변수를 모두 모은 후 매개변수를 정규화합니다. 그리고 서명을 생성하는 등 절차가 매우 복잡하였습니다. OAuth 2.0에서는 Bearer token을 사용하여 토큰만 지참하면 사용할 수 있도록 하였고 TLS를 사용해 암호화된 연결을 하는 HTTPS를 사용하여 보안에 강화하였습니다.
🔵 제한적 사용 개선을 위한 grant 도입
다양한 환경에 접근하기 위해 크게 4가지 grant 방식을 도입하였습니다.
이를 통해 브라우저나 windows, api, mobile 등 다양한 환경에 적용할 수 있게 되었습니다.
🔵 토큰 갱신
OAuth 1.0은 인증받은 access token의 유효기간이 길었고 심지어 유효기간이 없는 토큰도 존재하였습니다. OAuth 2.0에서는 access token의 유효기간을 짧게 하고 대신 refresh token을 통해 access token을 재발급받게 함으로써 어뷰징에 대한 보안을 강화하였습니다.
위에서 언급한 4가지 grant 중 대표적으로 자주 사용하는 Authorization Code Flow에 대해서 설명해 보겠습니다.
Authorization Code Flow
✅ Authorization Code Flow
인증 코드(authorization code)를 이용한 방식으로 동일하게 3개의 참여 주체가 존재합니다.
Authorization Code Flow의 동작 진행 방식입니다.
사용자가 서비스(Server)에 접근하기 위해 Id, password를 이용하여 접근하는 것이 아닌, IDP (resource server)를 통해 인증을 진행하며, 이때 인가 코드 (Authorization code)를 통해 access token을 발급받음으로써 인증을 가능하게 합니다.
다만, 위에 flow처럼 진행하기 위해서는 IDP에서 발급한 client_id, client_secret, 정보를 server에 등록해야 합니다.
또한, 서버는 인증이 완료된 후 code를 받아야 할 redirect_url 정보를 IDP에 등록해야 합니다.
이렇게 Authorization Code Flow를 사용하기 전에 사전 작업이 필요합니다.
✅ Access Token의 활용
이렇게 발급받은 access token으로 무엇을 할 수 있을까요? 대표적으로는 SSO (single-sign-on)로 활용할 수 있습니다.
그리고 access token으로 Header에 Bearer 타입으로 담아서 해당 서비스의 api 기능을 사용할 수 있습니다.
OAuth 2.0 심화
✅ OAuth 2.0 vs OIDC
OAuth 2.0 자료를 조사하다 보니 OIDC에 대해서도 자주 보게 되어서 같이 찾아보았습니다.
OIDC (Open IDentity Connect)는 OAuth 2.0 프로토콜 기반으로 상위계층에서 인증을 처리하며, 인증 (Authentication)에 목적이 있습니다. 그래서 SSO에 많이 사용됩니다.
OAuth 2.0과 거의 방식이 비슷하지만 가장 큰 차이점은 access token 외에 id_token을 발급하며 해당 토큰은 JWT로 되어있습니다.
사용자 정보를 가져오려면 기존 OAuth 2.0은 access token을 통해 사용자 정보를 다시 한번 호출해서 받아와야 하지만, OIDC는 JWT로 구성된 id_token을 decode 하면 payload에 사용자를 식별할 수 있는 정보를 받을 수 있기 때문에 사용자 정보를 위한 호출을 1단계 생략할 수 있습니다. 즉, 네트워크 통신 비용이 줄어들게 됩니다.
✅ Authorization vs Authentication
이번 자료를 준비하면서 개념적으로 많이 헷갈린 부분이 바로 Authorization (인가)와 Authentication (인증)의 개념과 차이점입니다.
일단, 용어적으로 해석하자면 Authorization (인가)는 What the user can do. 즉, 사용자가 무엇을 할 수 있는지 이며, Authentication (인증)은 who a user is. 사용자가 누구인지입니다.
그렇다면 OAuth는 Authorization (인가)이고 OIDC는 Authentication (인증)으로 설명하는 이유는 무엇일까요? 제가 조사한 바로는
Authorization (인가)는 token을 받는 행위 즉, 리소스의 접근을 뜻하며, Authentication (인증)은 id_token을 받기 때문에 신원 확인(내가 누구인지)의 행위로 판단된다고 보입니다.
Authorization (인가)와 Authentication (인증)의 가장 큰 차이점은 인증에서는 인가로 가능하지만 인가에서는 인증으로는 가능하기 어렵습니다. 간단히 설명하면 영화표는 영화를 볼 수 있는 인가에 해당됩니다. 그러나 영화표만으로는 내가 누구인지 알 수 없고 영화표만 있으면 누가 구매를 했든 간에 영화를 볼 수 있기에 인증으로는 사용하기 어렵습니다.
👀 마무리
OAuth 2.0에 대해서 사내 발표를 맡게 되어서 여러 방면에서 자료를 조사하게 되었습니다. 특히나 이번엔 등장배경에 대해서도 살펴보게 되면서 약간 알쓸신잡 느낌이 있어서 몰입도도 높아지고 궁금했던 부분도 알게 되어 매우 흥미롭게 조사할 수 있어서 좋았습니다.
OAuth 2.0은 SSO에 많이 사용되기 때문에 외부 연동 작업에 많이 요구되는 작업입니다.
한 번쯤 알아 두면 매우 유용하게 사용할 수 있습니다!
참고
ByteByteGoHq/system-design-101