OAuth를 이용해 로그인 기능을 구현하다보면, 자연스럽게 생기는 의문이 있다.
Access Token은 어디에, Refresh Token은 어디에 저장할까?
이 내용을 알기 전에, 먼저 OAuth 정의부터 알아보자.
OAuth는 Open Authorization의 약자로, 신뢰할 수 있는 제 3자 인증 제공자(구글, 카카오, 네이버 등)를 통해 프로필 정보, 이메일 등에 대한 접근 권한을 위임받을 수 있도록 하는 인증 및 권한 부여 프로토콜이다.
SNS 로그인은 사용자가 구글, 네이버 등 SNS 서비스에 로그인을 하고, 이 로그인과 OAuth 기술을 통해 사용자 정보를 해당 SNS로 부터 받아와 웹 서비스에 회원가입과 로그인을 하는 것을 말한다.
정의에 대해 알아봤으니, 이제 어떻게 흘러가는지 알아보자.예시는 구글 OAuth를 기준으로 설명하겠다.
구글에서는 후자의 방식을 권장한다. 왜냐하면 인가 코드를 가지고 Access Token을 요청할 때는, 구글 서버가 아닌 우리 서버에서 요청을 보내는 것이므로 HTTP POST 요청을 해서, HTTP Response으로 데이터를 받을 수 있기 때문에, 인가 코드를 Body에 담아서 보낼 수 있으므로 보안상 안전하기 때문이다.
그럼 "인가 코드를 누군가 중간에 가로채면 위험한 거 아닌가?"
이런 의문이 들 수 있지만, 실제로는 크게 걱정할 필요가 없다.
예를 들어, 우리 서버 주소가 https://myserver.com이라고
가정해 보자.
사용자가 구글 로그인을 완료하면, 구글은 사전에 등록된 redirect_uri로만 인가 코드를 전송한다.
즉, 인가 코드는 등록된 서버가 아니면 절대 전달되지 않는다.
또한 우리 서버가 이 인가 코드를 들고 Google Token Endpoint에 토큰 발급 요청을 보내면, 구글은
1. 인가 코드가 유효한지
2. redirect_uri가 정확히 일치하는지
3. client_id가 맞는지
를 모두 검증한 뒤에만 Access Token을 발급해 준다.
따라서 인가 코드를 단순히 탈취하더라도,
redirect_uri·client_id가 맞지 않으면 토큰을 발급받을 수 없기 때문에 실제 보안 위협은 거의 없다.
이런 안전성이 가능한 이유는 인가 코드가 내부적으로 client_id, redirect_uri 등 검증용 정보와 강하게 묶여 있기 때문이다.
이처럼 인가 코드 흐름은 보안적으로 안전하게 설계되어 있다.
그렇다면 이제 우리 서버가 구글이나 카카오로부터 어떤 사용자 정보를 받아올 수 있는지,
즉 정보의 범위(scope) 가 무엇인지 살펴볼 필요가 있다.
Scope란 자사 서비스가 구글, 카카오 등 OAuth 제공자에게 요청할 수 있는 사용자 정보의 범위를 의미한다.
예를 들어 이메일, 프로필, 닉네임 등의 항목이 여기에 해당한다.
이 Scope는 인가 코드를 요청할 때 함께 지정하며, OAuth 제공자는 이 Scope에 따라 사용자에게 “어떤 정보를 제공해도 되는지”에 대한 동의를 받는다.
이제 OAuth 구현 방식에 대해 알아보자.
가장 일반적으로 사용하는 구조로, 프론트엔드에서 인가 코드를 받고, 실제 토큰 교환과 인증 처리(Access Token 발급, 사용자 정보 요청)는 백엔드 서버에서 담당하는 방식이다.
동작 방식
1. 프론트엔드에서 구글 로그인 화면을 구글에 요청해 구글 로그인 페이지로 사용자를 Redirect 한다.
2. 사용자가 구글 로그인 화면에서 로그인을 완료한다.
3. 구글에서 내 프론트화면으로 인가코드를 URL에 담아 Redirect한다.
4. 프론트엔드가 받은 인가코드를 Spring(백엔드) 서버로 전달한다.
5. 서버에서 인가코드를 사용해 구글 서버에 Access Token.(필요 시 Refresh Token 포함)을 요청한다.
6. 발급받은 Access Token을 통해 구글 API에서 사용자 정보(id, email, name 등)를 구글 서버에 요청 후 인증하여 조회한다.
7. 사용자 정보가 확인되면 서버는 자체 로그인 처리 후 JWT 토큰을 클라이언트에게 발급한다.

장점
단점
Spring의 oauth2-client 의존성을 활용해, 서버에서 인가코드, AccessToken 발급, 사용자 요청까지 모든 절차를 서버에서 자동 처리하는 방식이다.
장점
단점

유익하네요