본문 바로가기

개발/React.js

OAuth 인증 - 인가에 대하여

0. Prologue

사이트를 개발하겠다고 하면 빠질 수 없는 회원 관리와 로그인. 그런데, 솔직히 정작 ‘로그인은 어떻게 구현하는가?’에 대해서 깊게 고민해본적은 없었던 것 같다. 그래서, 이번 기회로 집중해서 알아 보게 되었다.

단순하게 생각하면 ‘그냥 유저 테이블에 아이디, 이메일, 비밀번호, 연락처 등 정보 넣고, 비밀번호는 암호화해서 넣으면 되는거 아니야?’라고 생각할 수도 있다. 하지만, 유저 테이블에 아이디와 비밀번호를 암호화해서 넣는 방식은 이제 절대로 쓰면 안 되는 방법이다. 상당히 구식일 뿐더러, 보안에 틈이 많아 추후 문제가 생길 소지가 다분하다.

그래서 위 방법으로부터 발전된 형태는 유저 테이블에 저장된 비밀번호 해시값을 사용자의 입력에 따른 해시값과 비교하여 동일하면 true가 되는 방법인데, 이것 또한 현 시점에서는 상당히 구식이다. (이렇게 구현하는 회사가 있다면 거르라고 … 들었다. ㅎㅎ)

그렇다면 로그인은 어떻게 구현하는 것이 현 시점에서 가장 올바른 방법일까? 바로 OAuth라고 하는 기능이다.

1. OAuth 2.0이란?

 

 

소셜 계정으로 로그인 하는 방식은 워낙 많이 봐서 익숙하실 것이다. OAuth의 정확한 정의는 다음과 같다.

Open Authorization의 약자로 인터넷 사용자들이 비밀번호를 제공하지 않고, 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근권한을 부여할 수 있는 공통적인 수단이다.

다시 말해, 애플리케이션이 특정 시스템의 보호된 리소스에 접근하기 위해 사용자 인증(Authentication)을 통해 사용자의 리소스 접근 권한(Authorization)을 위임받는 것을 의미한다.

옛날에는 사용자들이 직접 해당 사이트에 아이디와 비밀번호를 입력하고 접근하는 경우가 많았다. 그런데, 사용하는 웹사이트마다 개인 정보를 입력하고 그것이 다수 사이트 서버에 저장되면 당연히 보안에 취약해질 수 밖에 없다. 이러한 이유로 트위터의 주도하에 OAuth 1.0이 최초로 탄생하게 되었는데, 서비스가 자체적으로 회원 시스템을 만들지 않고 기존에 많이 갖고 있는 계정을 연결해서 사용하는 방법이다. 사용자들은 굳이 새로 가입하지 않아서 좋고 더 튼튼하고 안전한 계정을 사용할 수 있어서 좋다.

⚡ Oauth 1.0 → Oauth 2.0 달라진 점

  • 기능의 단순화, 기능과 규모의 확장성을 지원
  • https 암호화 필수
  • 1.0은 인증방식이 한가지였지만, 2.0은 다양한 인증방식을 지원
  • api 서버에서 인증서버와 리소스 서버 분리

2. 0Auth 흐름 이해

  1. 리소스 소유자(이하 유저)가 클라이언트 서비스를 이용하고자 이용 요청을 클라이언트에게 보냅니다.
  2. 클라이언트는 검증 서버에 Access Token을 요청합니다.
  3. 검증 서버는 유저에게 인가 동의를 요청합니다.
  4. 유저는 인가 동의를 응답합니다.
  5. 검증 서버는 리소스에 접근할 수 있는 Access Token을 생성해 클라이언트로 전송합니다.
  6. 클라이언트는 Access Token을 저장합니다.
  7. 클라이언트는 Access Token을 가지고 리소스 서버에 요청을 보냅니다.
  8. 리소스 서버는 Access Token의 유효성을 파악하고 나서, 요청한 리소스를 클라이언트에 응답합니다.
  9. 클라이언트는 유저에 서비스 이용을 응답합니다.

3. Id Token과 Access Token 차이점

ID Token

기존에 사용자들이 갖고 있는 계정을 새로운 서비스에 연결하기 위해서 발행하는 토큰이다.

계정 서비스를 제공하는 주체가 이 계정을 사용하고 싶은 서비스에게 내어 주는 토큰이고, 이 토큰은 JWT 형태로 발행된다. 그리고 그 내용은 투명해서 누구든지 수학적으로 복호화해서 내용을 확인할 수 있다. 이 때 사용되는 표준이 OIDC이다. 세계적으로 ID Token을 제공하는 주체가 여럿 있는데 대표적으로 Google, Microsoft, Facebook, Apple, Twitter, Kakao 등이 있다.

Access Token

이 토큰은 일종의 방문증 같은 개념이다. 뭔가를 할 수 있는 권한에 대한 것이다. 이것에 대한 프로토콜은 OAuth이고 최신 버전은 2라서 보통 OAuth2라고 말한다. 이 토큰은 주로 api를 사용할 때 제시한다.

요즘 만드는 서비스들은 자체적인 회원 시스템을 만들지 않고 주요한 계정에 의지해서 운영한다. 이런 social login을 공급하는 주체 중 가장 일반적인 주체는 구글이다. 구글이 만든 안드로이드 폰을 사용하려면 구글 계정이 필요하기 때문이다. 따라서, 지금 세계적으로 문명인이라면 이미 구글 계정을 가지고 있다고 믿어도 된다. 그래서 구글 계정과 연결된 ID Token을 활용하는 것을 익힐 필요가 있다.

'개발 > React.js' 카테고리의 다른 글

Dynamic Route - Slug  (0) 2024.09.13
Xlsx parsing + react-table  (0) 2024.09.13
전역 상태 관리 라이브러리 - Zustand vs Recoil  (0) 2024.09.13
파일 Drag & Drop  (0) 2024.09.13
Excel 파싱 관련  (0) 2024.09.13