본문 바로가기
  • 시 쓰는 개발자
1일 1개념정리 (24년 8월~)/Spring

1일1개 (50) - OAuth 2.0

by poetDeveloper 2024. 10. 4.
반응형

1일 1개념정리 24.08.09.금 ~ 

 

큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.

무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#50. OAuth 2.0

Spring 개발하다가 소셜 로그인을 쓸 일이 있으면 이 단어가 꼭 나온다. OAuth 2.0에 대해 알아보자.

 

우아한테크톡 "홍실의 OAuth 2.0"을 참고해 정리하였습니다.

 

OAuth 맥락

OAuth(Open Authorization)는 내 서비스가 사용자의 자격 증명을 "직접" 하지 않고, 제한된 접근 권한을 주는 "인증 프로토콜"이다. 사용자의 pw나 민감정보를 직접적으로 공유하지 않고도 데이터를 안전하게 접근할 수 있도록 하는 프로토콜이다. 보통 우리는 카카오로그인 등에서 봤을 것이다.

 

일단 맥락을 살펴보자.

 

선 요약 : OAuth는 인가를 위한 기술임. 인증은 사용자에게 맡기고 인가에 대해서 처리함.

 

상황 : 내가 사용자의 네이버캘린더 서비스를 통해 스케줄 정보를 받아서 이를 ai로 관리해주는 앱인 "광캘린더"를 만들려고 한다.

주의 : 소셜 로그인과 , OAuth는 약간 맥락이 다르다고 한다.

 

그럼 네이버 캘린더의 정보를 받아서 재가공해야하는데, 그렇게 하기 위해선 일단 사용자의 네이버 캘린더까지 접근해야한다. 그니까 이걸 OAuth 없이 하려면, 사용자가 우리 서비스에서 네이버로 로그인(직접 id, pw 치고) 한 다음에, 캘린더 정보 받아오고, 우리 서비스에서 캘린더 정보를 재가공해야한다. 근데 사용자는 내 앱을 뭘 믿고 네이버 로그인을 하겠는가 ??? 네이버 입장에서도 id, pw를 고스란히 나의 앱에 넘긴다면 부담스럽기도 하고 말이다.

 

근데 생각을 조금 달리 해보자. 광캘린더가 사용자의 id, pw가 궁금했을까 ?? 아니다. 우린 사용자의 네이버 캘린더 정보만 받으면 된다. 솔직히 사용자 id pw 필요없고 그냥 캘린더 정보 받아서 우리가 쓰고싶은 것이다. 따라서, "인증"절차는 사용자가 수행하되 캘린더에 대한 "인가"는 우리 서비스쪽에서 받는 것이다. (접근 권한을 우리 서비스에게 줌)

→ 이게 바로 OAuth의 시초이다. (인가만 신경쓰기 위함)

 

OAuth 흐름

용어를 살짝 정리하고 넘어가자. 우리 광캘린더 서비스에서 네이버 소셜 로그인 한다고 생각하면 된다.

  • 유저 : 인증을 수행함(로그인) = Resource Owner
  • 광캘린더(우리 서비스) : 권한을 위임받음 = Client
  • 네이버 : 권한을 부여 = Authorization Server
  • 네이버 : 리소스(캘린더정보) 제공 = Resource Server
  • 웹브라우저 : 인증 수행하는 장소 or 매개체 같은 느낌 (ex. 크롬) = User-Agent

자, 아까 말하길 인증은 사용자가, 권한은 서비스가 받는다고 했다. 그럼 일단 권한을 요청하는 주체가 우리 서비스임을 알려야 권한을 넘겨줄 것 아닌가 ?? 그래서 네이버에게 클라이언트ID와 비밀번호. 그리고 권한을 받을 장소인 Redirect URI를 알려줘야한다. redirect uri는 위 사진에도 살짝 나와있는데, 저기서는 내 블로그의 관리 페이지로 redirect하고있다. 즉, "나 OOO이야. 네이버 캘린더 접근 권한 요청했어. 여기 내 신분증과 비밀번호야. 권한은 저기 URI로 넘겨줘. 고마워" 이렇게 말하는 것이다.

 

흐름을 순서에 따라 정리해보자.

  1. 유저 : 나 네이버 로그인 할게요 ~
  2. 우리 서비스는 소셜 로그인 할 페이지를 사용자에게 제공.
  3. 그럼 사용자가 로그인 할텐데, 여기부턴 인증 부분이니깐 사용자인 Resource Owner랑 Naver인 Authorization Server만 참여한다. 광캘린더는 관여 X. 사용자랑 네이버만 주고받음.
  4. 로그인 성공하면 인증 유효함. 네이버가 Authorization code 제공. 이거로 권한을 발급받을 수 있음. 오케이 너 권한 받을 자격 인정
  5. 인정 받았으니까 우리 서비스 광캘린더는 이제 실제로 들락날락 할 때 사용할 Access Token 발급 요청 (네이버에게 요청)
    1. OAuth는 "인가"를 위한 기술이다. 근데 소셜 로그인은 "인증"이니깐, OAuth에 인증에 대한 개념을 살짝 추가한 것이 바로 OAuth 2.0이다. 여기서 추가된 개념이 "Open ID Connect(OIDC)"이다. OIDC는 OAuth 위에서 동작하며 인증을 처리한다. 이 시점에서 Access Token과 함께 ID Token도 발급해달라고 요청하는 것이다. 이 토큰 받아서 디코딩하면 유저 ID 얻을 수 있다. (즉, OIDC를 통해서 Access Token과 함께 ID Token도 달라고 요청)
  6. 네이버는 우리 서비스에게 Access token과 Refresh Token 제공. (출입증 제공)
  7. 그럼 여기부터는 이제 접근이 가능하니까, 유저가 네이버 관련 서비스를 접근할 때 광캘린더에게 리소스 요청하면, 아까 발급받은 Access Token으로 네이버에게 리소스 달라고 요청하고, 네이버는 토큰 검증한 다음에 리소스를 제공한다.
반응형