jujuwon
시크릿주주
jujuwon
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • 🔠 프로그래밍언어 (35)
      • ☕️ Java (19)
      • 🐠 Python (15)
      • 🍠 Kotlin (1)
    • 🔙 Backend (16)
      • 🌿 Springboot (12)
      • 🐳 Docker (1)
      • ☁️ AWS (3)
    • 💼 CS (12)
      • 📶 Network (12)
    • 🕹 알고리즘 (14)
      • 📑 스터디 (2)
      • 💁🏻‍♂️ 백준 (9)
      • 👨🏼‍🔬 프로그래머스 (3)
    • 📚 Book (8)
      • 🔎 오브젝트 (4)
      • 🧪 TDD (2)
      • 📜 논문 (2)
    • 🔐 보안 (7)
      • 👾 Pwnable (7)
    • 📝 회고 (4)
    • 🧩 etc. (10)
      • ⚠️ issue (2)
      • 💡 꿀팁 (7)
      • ✏️ 끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
jujuwon

시크릿주주

OAuth 정복기 (OAuth1.0 에서 OAuth2.0로)
💼 CS/📶 Network

OAuth 정복기 (OAuth1.0 에서 OAuth2.0로)

2023. 6. 8. 19:27
반응형

OAuth : Open Authorization (+Authentication)

OAuth 는 “인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹 사이트 상의 자신들의 정보에 대해

웹사이트나 어플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한

개방형 표준 프로토콜이다.” (위키백과) 

무슨 말인데 이게

 

예를 들어 “juju” 라는 웹사이트가 있다고 하자.

juju 는 사용자 인증을 위해 Google 이나 Kakao 등의 소셜 로그인 방식을 사용한다.

이렇게 로그인하게 되면 juju 는 외부 서비스 (Google, Kakao) 의 특정 자원을 접근 및 사용할 수 있는 권한을

인가 받게 된다. 이때 사용되는 프로토콜이 바로 OAuth !

접근 권한을 위임 받을 수 있는 표준 프로토콜 !

방금 인가 라는 말을 썼는데, 인증(Authentication)과 인가(Authorization)는 다르다.

인증은 “이 사용자가 검증된 사용자인지” 확인하는 것이고, 인가는 “이 사용자가 해당 권한이 있는지” 확인하는 것이다.

예를 들어 소셜로그인에서 Google 로그인 자체는 인증의 과정이고,

Google 로그인 후 캘린더 정보를 가져올 수 있는 사용자인지 확인하는 것은 인가의 과정이라고 볼 수 있다.

 

왼쪽은 인증 / 오른쪽은 인가 느낌쓰 (사진 출처 : https://developers.google.com/identity/protocols/oauth2/limited-input-device?hl=ko)

OAuth 왜 쓰나

쉽게 말해서 juju 라는 서비스 자체에서 아이디 비밀번호를 이용해서 로그인을 하도록 만들지 않고

Google 아이디와 비밀번호를 이용해서 구글에 로그인하고, 그 정보를 가지고 회원 인증을 진행하는 것이다.

근데 juju 를 이용하는 사용자가 구글 회원이라는 건 어떻게 인증할까?

🙋‍♂️ : 사용자한테 직접 아이디, 비밀번호를 받아서 로그인을 해보면 됩니다.

말도 안 되는 방법이다 .. 그래서 OAuth 가 생겼다 !

다른 서비스의 회원 정보를 쉽고, 안전하게 사용하는 방법이 바로 OAuth 이다.

OAuth 는 단순히 사용자 인증을 하는 것 뿐 아니라 특정 권한을 주는 데에 목적이 있다.

Authentication 도 있지만, 주 목적은 Authorization !

 

OAuth 1.0

구성

  • user
  • consumer
  • service provider
  • consumer secret
  • request token
  • access token

사진 출처 : https://showerbugs.github.io/2017-11-16/OAuth-란-무엇일까

먼저 OAuth 1.0 에 대해서 알아보자.

OAuth 1.0 에는 사용자(user), 소비자(consumer), 서비스 제공자(service provider)가 있다.

이 세 가지 요소가 상호작용하는 형태라고 생각하면 된다.

진행 과정은 아래와 같다.

  1. consumer 가 service provider 에게 Request Token 요청.
  2. service provider 가 consumer 에게 Request Token 발급.
  3. consumer 가 user 를 service provider 로 redirect.
  4. user 가 service provider ID/비밀번호 입력 (인증 수행)
  5. service provider 가 user 를 consumer 로 redirect.
  6. consumer 가 service provider 에게 Access Token 요청.
  7. service provider 가 consumer 에게 Access Token 발급.
  8. 발급된 Access token 을 이용하여 consumer 가 user 정보에 접근.

여기서 Request Token 은 service provider 가 권한 부여 요청을 확인했다고 consumer 에게 주는

일종의 임시 티켓 같은 것이다.

인증이 수행되고 user 가 consumer 에게 권한을 부여했음이 확인(Request Token 을 통해)되면,

service provider 가 Access Token (보호 자원 접근 티켓) 을 consumer 에게 발급하는 형태 !

문제점

  • 웹이 아닌 어플리케이션에서 지원 부족
  • HMAC 을 통해 암호화 하는 과정이 번거로움
  • access token 이 만료되지 않음

→ 그래서 2.0 이 등장 🙌

2.0이 나오기 전, Access Token 이 노출될 수 있는 위험이 있기 때문에 이를 보완한 1.0a 방식이 나왔었다.
Access Token 을 Redirect 를 이용해 전송하지 않고 중간에 확인 코드를 이용해
백채널에서 Access Token 을 Consumer 로 바로 전송하도록 변경 !
하지만 아직도 위 문제점은 존재 ..

 

OAuth 2.0

OAuth 1.0 과 비교하여 2.0에서 달라진 점은 아래와 같다.

  • HTTPS 가 필수 ! 암호화는 HTTPS 에 위임.
  • API 서버에서 인증서버를 분리
  • 다양한 인증 방식 지원
  • 만들어질 때부터 표준 프로세스로 만들어짐

OAuth 2.0 의 주체로는 Resource Owner, Client, Resource Server, Authorization Server 가 있다.

  • Resource Owner : Google 이나 Kakao 와 같은 플랫폼에 정보를 가지고 있는 사용자를 의미한다.
  • Client : Resource Server 의 자원을 이용하고자 하는 서비스. 우리가 만든 서비스가 이에 해당한다.
  • Authorization Server : Resource Owner 에 대해 인증하고, Client 에게 Access Token 을 발급해주는 서버
  • Resource Server : Google, Kakao 와 같이 정보를 가지고 있는 서버

그럼 2.0 에서는 어떻게 인증 과정을 거치는지 살펴보자.

사진 출처 : https://developers.payco.com/guide

 

인증과정을 순서대로 살펴보자.

1~5 단계는 사용자가 Google 이나 Kakao 와 같은 서비스에 로그인을 시도하면, Authorization Code 를 발급받는 과정.

7~8 단계는 해당 Authorization Code 를 이용해서 Client 가 Access Token 을 발급받는 과정.

10~11 단계는 발급받은 Access Token 을 이용해서 Client 가 회원정보를 받아오는 과정.

위 과정은 OAuth 2.0 의 인증 종류 중 흔하게 볼 수 있는 Authorization Code Grant 방식이다.

다른 방식들도 있지만, 일단 이 방식을 기준으로 이해해보자.

 

Access Token

먼저 OAuth 의 핵심인 Access Token 은 일종의 위임장 같은 것이다.

Access Token 은 일종의 문자열이고, 이 토큰을 이용해 Google 과 같은 서비스는 인증된 사용자라는 것을 판단한다.

어쨌든 이 Access Token 을 Client 가 가지고 있다면,

사용자의 정보를 Client 가 확인하도록 사용자가 동의했다는 일종의 증표인 셈이다.

위 과정의 11~12 번에서 Client 는 Resource Server 에서 사용자의 정보를 가져와서 볼 수 있는 것이다.

 

Authorization Code

사용자가 Google 에 로그인을 해서 Access Token 을 발급받았다고 치자.

그럼 Client 는 이 Access Token 을 어떻게 받을 수 있을까?

사용자가 받은 Access Token 을 다시 Client 쪽으로 전송하도록 구현할 수도 있지만,

그렇다면 XSS 나 피싱 사이트 등에서 Access Token 을 탈취할 수 있는 보안적 위험이 존재한다.

그래서 Access Token 을 직접 사용자단까지 전달하지 않고 Client 와 OAuth 서버 간에 전달할 수 있도록

인증 코드를 교환하는 단계를 하나 더 거치는 것이 위에서 잠깐 얘기한 Authorization Code Grant 방식이다.

이 과정은 위 예시 사진에서 1~6에 해당하는 단계이다.

쉽게 설명하자면 사용자가 웹브라우저를 이용해 Google 로그인을 진행하면

바로 Access Token 을 응답으로 주는 것이 아니라 Authorization Code 를 발급한다.

그리고 이 코드를 HTTP Redirect 를 이용해서 전송한다.

Client 는 해당 Authorization Code 를 이용해서 OAuth 서버로 Access Token 을 요청하고,

발급받은 Access Token 으로 사용자 정보를 조회하는 구조 !

즉 Authorization Code 가 발급된 이후부터는 사용자 단에 Access Token 이 노출되지 않는다.

이렇게 하면 토큰이 탈취될 수 있는 위험이 사라진다.

🙋‍♂️ : Authorization Code 가 탈취되면 똑같지 않나요 ?

OAuth 서비스를 이용하기 위해 먼저 OAuth 서버에 정보를 등록해야 하는데,

그때 Authorization Code 를 받을 Redirect_uri 를 약속하고,

OAuth 서버에서 알려주는 client_id 와 client_secret 을 이용해 Client 를 식별한다.

예를 들어 해커가 다른 Redirect_uri 로 Authorization Code 를 받으려고 한다면,

Google 에서는 등록된 Redirect_uri 와 다르기 때문에 보내주지 않는다.

또 Authorization Code 를 탈취해도 client_id 와 client_secret 을 모르기 때문에

Access Token 을 받을 수 없다 !

 

인증 종류

OAuth 2.0 에서 달라진 점으로 다양한 인증 방식을 지원한다고 했는데, 총 4가지의 인증 방식이 있다.

  1. Authorization Code Grant
    위의 예시로 보인바와 같다.
  2. Implicit Grant
  3. Password Credentials Grant
  4. Client Credentials Grant

이건 다음에 알아보자

 

728x90
반응형
저작자표시 (새창열림)
    '💼 CS/📶 Network' 카테고리의 다른 글
    • JWT가 뭔데요?
    • Network :: Flow Control & Congestion Control
    • Network :: TCP
    • Network :: UDP
    jujuwon
    jujuwon

    티스토리툴바