[OAuth2 로그인 구현기 1] OAuth2와 카카오 로그인

김민제·2024년 10월 14일

Spring🌱

목록 보기
8/8
post-thumbnail

👉 블로그 이전했습니다!!
https://alswp006.github.io/

  • 저는 이번 프로젝트에서 소셜 로그인을 구현하려 하는데 소셜 로그인에 대해서 조금 더 깊은 이해가 필요하다고 생각하여 흐름 위주로 공부를 해보려 합니다!
  • 차근차근 공부해가며 각 프로젝트마다 사용해야하는 방식을 정해보고 흐름에 따라 구현해보려 합니다.
  • 그 시작으로 OAuth2를 간단하게 훑고 가려고 합니다!

OAuth2란?

  • OAuth2(Open Authorization 2.0)*는 인터넷 사용자들이 비밀번호를 제공하지 않고도 타사 애플리케이션이 사용자 정보를 안전하게 접근할 수 있도록 허용하는 인증 및 인가 프레임워크입니다. OAuth2는 주로 권한 부여(Authorization)를 처리하며, 클라이언트 애플리케이션이 자원 소유자의 권한 하에 보호된 자원에 접근할 수 있게 합니다.

OAuth2의 주요 개념

  1. 자원 소유자(Resource Owner): 보호된 자원의 소유자로, 일반적으로 최종 사용자입니다.
  2. 클라이언트(Client): 자원 소유자를 대신하여 보호된 자원에 접근하려는 앱입니다. 즉, 저희가 아는 프론트 단입니다.
  3. 자원 서버(Resource Server): 보호된 자원을 호스팅하는 서버로, API 등을 제공합니다.
  4. 권한 부여 서버(Authorization Server): 자원 소유자의 인증을 수행하고, 액세스 토큰(Access Token)을 발급합니다.

OAuth2의 인증 흐름

OAuth2에는 다양한 인증 흐름(Grant Types)이 존재하며, 각기 다른 시나리오에 맞게 사용됩니다.

  1. Authorization Code Grant: 서버 측 애플리케이션에서 주로 사용되며, 클라이언트가 브라우저를 통해 권한 부여 코드를 받은 후, 서버 측에서 액세스 토큰으로 교환합니다.
  2. Implicit Grant: 클라이언트 측 애플리케이션(SPA 등)에서 사용되며, 브라우저에서 직접 액세스 토큰을 받습니다. 보안상의 이유로 현재는 잘 사용되지 않습니다.
  3. Resource Owner Password Credentials Grant: 자격 증명(아이디/비밀번호)을 직접 입력받아 토큰을 발급받습니다. 신뢰할 수 있는 클라이언트에서만 사용해야 합니다.
  4. Client Credentials Grant: 클라이언트 자신이 자원 소유자인 경우 사용합니다. 주로 서버 간 통신에서 사용됩니다.

1. Authorization Code Grant (권한 부여 승인 코드 방식)

  • OAuth 2.0에서 가장 많이 사용되는 방식으로, 특히 서버 기반 애플리케이션에서 자주 사용됩니다. 클라이언트는 인가 코드를 먼저 받은 후 이를 이용해 액세스 토큰을 발급받습니다.
  • 흐름
    1. 클라이언트는 사용자에게 인가 요청을 보내고, 사용자는 권한 서버에서 로그인 및 권한 승인을 완료합니다.
    2. 권한 서버는 Authorization Code를 클라이언트의 리디렉션 URL로 전달합니다.
    3. 클라이언트는 이 Authorization Code를 사용해 액세스 토큰을 요청하고 발급받습니다.
  • 장점: 리프레시 토큰을 사용할 수 있어, 토큰이 만료된 후에도 새 토큰을 발급받을 수 있습니다.
  • 주로 웹 애플리케이션, 서버 측 애플리케이션에서 사용

2. Implicit Grant (암묵적 승인 방식)

  • 클라이언트 자격 증명을 안전하게 저장하기 어려운 환경(예: 자바스크립트 기반의 SPA 등)에서 사용되는 방식입니다. 인가 코드를 거치지 않고, 바로 액세스 토큰이 발급됩니다.
  • 흐름
    1. 클라이언트는 인가 요청을 보냅니다.
    2. 권한 서버는 사용자가 로그인 및 권한 승인을 완료하면 액세스 토큰을 리디렉션 URL로 바로 전달합니다.
  • 단점: 보안상 리프레시 토큰을 지원하지 않으며, 토큰이 URL을 통해 직접 전달되므로 누출 위험이 있습니다.
  • 주로 브라우저 기반의 애플리케이션(예: Single Page Application)에서 사용

3. Resource Owner Password Credentials Grant (자원 소유자 자격 증명 승인 방식)

  • 사용자 이름과 비밀번호를 직접 사용하여 액세스 토큰을 발급받는 방식입니다. 신뢰할 수 있는 클라이언트와 자원 서버가 같은 시스템에서 동작하는 경우에만 사용됩니다.
  • 흐름
    1. 사용자가 클라이언트에 자신의 usernamepassword를 제공합니다.
    2. 클라이언트는 이를 권한 서버에 전달하고, 액세스 토큰을 발급받습니다.
  • 단점: 외부 애플리케이션과의 통합에서는 보안 위험이 크므로, 자체 애플리케이션에만 사용하는 것이 권장됩니다.
  • 주로 사용자가 클라이언트와 서버 모두에 신뢰할 수 있는 환경에서 사용

4. Client Credentials Grant (클라이언트 자격 증명 승인 방식)

  • 주요 특징: 클라이언트의 자격 증명만으로 액세스 토큰을 발급받는 방식입니다. 이 방식은 주로 클라이언트가 직접 자신이 소유한 리소스에 접근할 때 사용됩니다.
  • 흐름:
    1. 클라이언트는 권한 서버에 자신의 client_idclient_secret을 전달합니다.
    2. 권한 서버는 이를 확인한 후, 클라이언트에게 액세스 토큰을 발급합니다.
  • 단점: 사용자의 개입 없이 클라이언트 자격 증명만으로 토큰을 발급받기 때문에, 자격 증명을 안전하게 보관할 수 있는 환경에서만 사용해야 합니다.
  • 사용 사례: 서버 간 통신, 마이크로서비스 간의 통신.

이 요약을 통해 OAuth 2.0의 각 권한 부여 방식을 쉽게 이해하실 수 있을 겁니다. 각 방식은 보안 요구 사항클라이언트 환경에 맞추어 다르게 사용되며, 그에 따라 액세스 토큰 발급 과정이 달라집니다.

카카오 로그인으로 알아보는 소셜 로그인

저는 이번 프로젝트에서 카카오 소셜 로그인만 사용하기로 했기 떄문에 카카오 로그인의 흐름을 알아보겠습니다.

Kakao Developers

카카오 로그인의 인증 흐름 방식은 Authorization Code Grant 방식입니다!

카카오 로그인 과정(REST API)

주요 개념

  • Service Client: 저희가 흔히 말하는 프론트엔드 단이라고 보면 될 것 같습니다.
  • Service Server : 백엔드 단입니다.
  • Kakao Auth Server: 카카오의 인증 서버입니다.

흐름

카카오 로그인의 큰 흐름은 다음의 세가지입니다.

  1. 인가 코드 받기
  2. 토큰 받기
  3. 사용자 로그인 처리

한 개씩 흐름을 살펴보겠습니다!

1. 인가 코드 받기 (인가 코드가 뭘까..)

  • 인가 코드(Authorization Code)는 OAuth Authorize URL 실행 후 사용자 약관 동의 시 발급되는 코드입니다.
  • Kakao Developers의 카카오 로그인 공식 문서에 인가 코드에 대한 설명이 자세히 되어있지는 않지만 “사용자가 인가를 완료하면, 서비스는 토큰 발급용 인가 코드를 전달받습니다.”라고 적혀있는걸 보면 인가 코드는 단순히 액세스 토큰을 발급하기 위한 용도인것을 유추해볼 수 있습니다.

Kakao Developers

  • 또한 비슷한 서비스인 KakaoPay Developers를 보면 인가코드에 대한 설명은 다음과 같습니다.

인가 코드(Authorization Code)는 OAuth Authorize URL 실행 후 사용자 약관 동의 시 발급되는 코드입니다.

액세스 토큰(Access Token) 발급하기 위해 사용됩니다. 일회성으로 유효시간은 1분으로 재사용이 불가합니다.

카카오페이 | 개발자센터

  • 정리해보면 인가 코드는 단순히 액세스 토큰을 발급하기 위한 코드이며 일회성이다! 라고 정리할 수 있겠습니다.
  • 인가 코드를 발급받는 흐름은 다음과 같습니다.

  • 표로 흐름이 너무 명확하게 나와서 이해하기는 쉬운 것 같습니다!
  • 카카오 로그인을 요청하여 카카오 내부에서 로그인을 한다면 카카오 로그인 동의 화면을 호출하고 이에 대한 동의까지 완료한다면 인가 코드를 발급받게 됩니다.
  • 이 과정을 통해 사용자는 카카오를 통해 인증과정을 거치고 백엔드 서버는 사용자의 인가 코드를 전달받습니다!
  • 요청 시 파라미터

Kakao Developers

  • 응답

Kakao Developers

2. 액세스 토큰 발급받기(액세스 토큰?)

  • 카카오 로그인에서는 액세스 토큰을 다음과 같이 설명하고 있습니다!

토큰은 사용자의 인증과 권한 정보를 담은 문자열입니다. 서비스는 인가 결과로 발급받은 인가 코드로 토큰 발급을 요청할 수 있고, 발급받은 토큰을 API 요청에 포함해서 정보 수신 또는 기능 사용 권한이 있음을 증명할 수 있습니다.

카카오 로그인은 OAuth 2.0 표준 규격에 따라 액세스 토큰(Access token), 리프레시 토큰(Refresh token) 두 종류의 토큰을 발급합니다. OpenID Connect를 활성화하면 ID 토큰을 추가로 발급받을 수 있습니다. 자세한 내용은 토큰별 역할과 만료 시간 표를 참고합니다.

Kakao Developers

  • 그러면 흐름을 살펴보겠습니다.

  • 우선 카카오에 토큰을 발급해주는 API로 POST 요청을 보냅니다.
  • url은 "https://kauth.kakao.com/oauth/token"이고 파라미터로 client_id, code, refresh_token, grant_type 넘겨주어 정보가 일치한다면 액세스 토큰을 발급받게 됩니다.
  • 여기서 얘기하는 액세스 토큰은 JWT의 액세스 토큰과는 다른 토큰입니다!
    • 뭐가 다르냐? 그냥 카카오 액세스 토큰을 JWT 액세스 토큰처럼 쓰면 안되냐?라는 의문이 드실 수도 있습니다.(저도 들었기 떄문에..) 이에 대한 내용은 다음 포스팅에서 하겠습니다!
  • 요청 시 파라미터

Kakao Developers

  • 응답

Kakao Developers

3. 사용자 로그인 처리

  • 이후 액세스 토큰으로 사용자 정보를 받아옵니다.
  • 로그인에 대한 사용자 처리는 서비스 서버에서 해줘야하는데 보통 다음과 같이 처리합니다.
    • 새로운 사용자: 카카오 로그인을 처음 시도한 사용자인 경우, 사용자 정보를 서버에 저장하고 인증 처리를 합니다.
    • 기존 사용자: 데이터베이스에 사용자 ID나 Email을 조회하고 사용자가 등록되어 있으면 사용자 인증 처리를 합니다.
  • 사용자 처리가 되면 서버의 사용자 인증 처리 후 로그인을 완료합니다.
    • 사용자 인증 처리라고 한 것은 JWT 방식을 쓰는 경우 JWT를 생성하고 클라이언트에 전달하는 등의 행위를 말합니다.

정리

  • 이렇게 OAuth2와 카카오 로그인에 대해서 학습해보았습니다.
  • 다음으로는 세션, JWT 등에 대해 학습해보고 프로젝트 특성을 고려하여 사용 방식을 정해보겠습니다.
  • 글을 작성하면서 토큰 탈취, 인가 코드 탈취 시 대응 등의 의문이 많이 생겨 공부했지만 이 곳은 기본적인 개념 공부를 포스팅하는 느낌이라 그 내용은 한번에 정리하여 업로드하겠습니다!
profile
블로그 이전했습니다!! 👉 https://alswp006.github.io/

0개의 댓글