[인증/보안] 기초 : OAuth

hosik kim·2022년 2월 28일
0
post-thumbnail

📌 OAuth 란?


: OAuth2.0은 인증을 위한 표준 프로토콜의 한 종류
보안 된 리소스에 엑세스하기 위해 클라이언트에게 권한을 제공(Authorization)하는 프로세스를 단순화하는 프로토콜 중 한 방법이다.

📌 OAuth 는 언제, 왜 쓸까?


유저 입장에서 생각해 보자면, 우리는 웹상에서 굉장히 많은 서비스를 이용하고 있고 각각의 서비스들을 이요하기 위해서는 회원가입 절차가 필요한 경우가 대부분이다.
그 서비스별로 ID와 Password를 다 기억하는 것은 매우 귀찮은 일이다.
OAuth를 활용한다면 자주 사용하고 중요한 서비스들(예를 들어 google, github, facebook)의 ID와 Password만 기억해 놓고 해당 서비스들을 통해서 소셜 로그인을 할 수 있다.

뿐만 아니라 OAuth는 보안상의 이점도 있다. 검증되지 않은 App에서 OAuth를 사용하여 로그인한다면, 직접 유저의 민감한 정보가 App에 노출될 일이 없고
인증 권한에 대한 허가를 미리 유저에게 구해야 하기 때문에 더 안전하게 사용할 수 있다.

📌 OAuth에서 꼭 알아야할 용어


  • Resource Owner : 액세스 중인 리소스의 유저이다. 김코딩의 구글 계정을 이용하여 App에 로그인할 경우, 이때 Resource owner은 김코딩이 된다.
  • Client : Resource owner를 대신하여 보호된 리소스에 액세스하는 응용프로그램이다. 클라이언트는 서버, 데스크탑, 모바일 또는 기타 장치에서 호스팅 할 수 있다.
  • Resource server : client의 요청을 수락하고 응답할 수 있는 서버이다.
  • Authorization server : Resource server가 액세스 토큰을 발급받는 서버이다. 즉 클라이언트 및 리소스 소유자를 성공적으로 인증한 후 액세스 토큰을 발급하는 서버를 말한다.
  • Authorization grant : 클라이언트가 액세스 토큰을 얻을 때 사용하는 자격 증명의 유형이다.
  • Authorization code : access token을 발급받기 전에 필요한 code이다. client ID로 이 code를 받아온 후, client secret과 code를 이용해 Access token 을 받안온다.
  • Access token : 보호된 리소스에 액세스하는 데 사용되는 credentials이다. Authorization code와 client secret을 이용해 받아온 Access token으로 이제 resource server에 접근을 할 수 있다.
  • Scope : scope는 토큰의 권한을 정의한다. 주어진 액세스 토큰을 사용하여 액세스할 수 있는 리소스의 범위이다.

🔸 Authorization Code Grant Type

: Grant Type 중에서 가장 일반적으로 사용되는 유형이다.

유저가 승인을 한 후에, 액세스 토큰을 얻기 위해 Authorization Code를 받아 액세스 토큰과 교환을 한다.
보안성 강화를 위해, 클라이언트에서 클라이언트 ID를 공유하여 Authorization Code를 받고, 서버에 이 Authorization Code를 요청하여 Access Token을 응답받는 방식이다.

Authorization Code Grant Type의 흐름은 다음과 같다.

  1. 먼저, 유저가 서비스 이용을 위해 클라이언트에 접근을 요청
  2. 클라이언트는 이 유저를 검증하기 위해 권한 관리 서버(Authorization Server)로 리다이렉트
  3. 권한 관리 서버에서 접근이 승인된다면, Authorization Code를 클라이언트에게 제공
  4. 클라이언트는 권한 관리 서버에 Authorization Code를 요청에 함께 담아 보내고, Authorization Code를 확인한 권한 관리 서버는 Access Token을 클라이언트에게 교환
  5. 클라이언트는 받은 Access Token으로 요청한 데이터가 존재하는 Resource Server에 접근할 수 있음.
  6. 클라이언트는 Access Token을 5번 획득했기 때문에, 이 토근으로 권한 관리 서버를 거치지 않고 직접적으로 Resource Server와 응답 교환
  7. Resource Server는 클라이언트가 요청한 리소스를 전달.

🔸 Refresh Token Grant Type

액세스 토큰은 유효 기간이 지나면 만료가 된다. 만료가 될 때마다 유저에게 인증을 요구하는 것이 번거롭다. 그래서 다시 액세스 토큰을 편리하게 받기 위해 Refresh Token을 사용한다.

액세스 토큰과 리프레쉬 토큰의 만료 유효 기간이 리프레쉬 토큰이 더 길기 때문에 가능한 방법이다.

  1. 만일 액세스 토큰이 만료된 유저가 클라이언트에 접근한 경우, 클라이언트는 권한 관리 서버에 리프레쉬 토큰을 요청한다.
  2. 권한 관리 서버는 새로운 액세스 토큰을 응답한다.
  3. 클라이언트는 액세스 토큰으로 유저의 Resource Server에 접근을 요청한다.

📌 소셜 로그인 로직 플로우

스프린트에서 OAuth App을 통해 Access token을 받아오는 과정은 다음과 같다.

profile
안되면 될 때까지👌

0개의 댓글