Backend/Java

Spring Security OAuth2

개발자의 첫 걸음 2025. 12. 8. 10:00

안녕하세요. 오늘은 스프링 시큐리티의 OAuth2에 대해 알아볼게요.

 

 

OAuth2의 필요성

 

기존 로그인 방식은 어떤 서비스(A)가 다른 서비스(B)의 데이터를 사용하려면

 

사용자의 아이디 / 비밀번호를 A에게 직접 입력해야 해서 사용자의 전체 권한이 노출되는 위험이 있었어요.

 

OAuth2는 이런 위험을 권한 위임으로

 

"비밀번호를 주지 않으면서 일부 기능만 허용"하게 해주는 표준 프로토콜이에요.

 

 

 

OAuth2의 주요 구성 요소

 

구성 요소 설명
Resource Owner(사용자) 실제 계정을 가진 사람
Client(우리 서비스) 정보를 얻고 싶은 서비스
Authorization Server(카카오, 구글 등) 로그인 인증 + 토큰 발급
Resource Server 실제 데이터 API 제공 (예: 프로필, 이메일)

 

 

 

OAuth2의 핵심 개념

 

1. Authorization Code (인가 코드)

 

사용자가 로그인하면 소셜 버서가 클라이언트에게 보내는 "일회용 코드"로 

 

이 코드를 서버에서 Access Token으로 교환해요.

 

 

2. Access Token

 

유저 정보 접근 가능한 "임시 키"만료시간이 짧아요. (보통 1시간)

 

 

3. Refresh Token

 

Access Token 재발급용으로 Spring OAuth2 자체에서는 Refresh Token을 거의 사용하지 않아요.


 보통 “우리 서버의 JWT Refresh Token”을 따로 관리해요.

 

 

 

OAuth2 로그인 전체 흐름 (Spring Security 기준)

 

 

1. 사용자가 프론트에서 구글 로그인 클릭 → 프론트가 백엔드로 이동

GET /oauth2/authorization/google

이 URL은 Spring Security가 자동으로 만들고 관리하는 "OAuth2 로그인 시작 URL"이에요.

 

 

2. Spring Security 가 구글 인증 페이지로 리다이렉트

 

OAuth2 AuthorizationRequestRedirectFilter가 동작

 

구글 인가 서버로 리다이렉트 하고 redirect_uri, client_id, scope 등을 같이 보내요.

https://accounts.google.com/o/oauth2/v2/auth?
   client_id=...
   redirect_uri=https://api.server.com/login/oauth2/code/google
   scope=email profile
   response_type=code

 

 

3. 사용자가 구글 로그인 완료 → "Authorization Code" 발급

 

구글을 사용자를 다음으로 보내는데요.

/login/oauth2/code/google?code=abcd1234

여기까지는 프론트가 관여를 하지 않아요.

 

순수하게 백엔드(Spring Security)로 돌아오는 과정이에요.

 

 

4. 서버에서 Authorization Code → Access Token 교환

 

OAuth2 LoginAuthenticationFilter → DefaultAuthorizationCodeTokenResponseClient가 동작해

 

{ 구글 토큰 요청(Post), Access Token 발급, Access Token으로 사용자 정보 조회 }

 

이 과정도 Spring이 자동 수행해요.

 

 

5. CustomOAuth2 UserService에서 사용자 정보 처리

 

커스텀 서버에서 

 

{ 이메일, 닉네임, provider(google), providerId(google의 sub) }

 

등을 추출하고 DB의 User 엔티티와 매핑해요.

 

여기서 해야 하는 작업은 DB에 해당 이메일의 유저 존재 체크와 없으면 자동 회원 가입,

 

그리고 유저 정보(UserDetails 형태) 반환이에요.

 

 

6. 성공 시 OAuth2 AuthenticationSuccessHandler 실행

 

여기에서 우리 서비스 전용 JWT AccessToken + RefreshToken 생성과 프론트 콜백 URL로 리다이렉트 하는데요.

http://localhost:5173/oauth2/callback?accessToken=...&refreshToken=...

 

 

여기서 프론트는 JWT를 저장(localStorage, cookie 등)해요.

 

 

 

OAuth2 (소셜 로그인)과 JWT의 역할 차이

 

기능 OAuth2 (구글/네이버/카카오) 우리 서비스 JWT
로그인 인증 YES NO (이미 인증된 유저에게 발급)
사용자 정보 제공 YES NO
서버 권한 제어 NO YES (우리 API 접근 권한 관리)
프론트/백 간 인증 NO YES

표를 보시면 OAuth2는 소셜 로그인을 대신해 주는 인증 시스템이고,

 

JWT는 우리 서버 API 보호용 인증시스템을 확인할 수 있어 역할이 다르다는 걸 볼 수 있어요.

 

 

 

User 엔티티 provider, providerId 필요성

 

provider는 {GOOGLE / KAKAO / NAVER / LOCAL} 구분으로  어떤 방식으로 가입된 회원인지 구분해야 하고,

 

providerId는 소셜에서 제공하는 고유 식별값 { Google sub, Kakao id, Naver id}이에요.

 

provider , providerId 이 두 가지를 기준으로 유저를 식별해서 이메일이 바뀌어도 동일 사용자로 인식 가능해요.

 

 

 

OAuth2 요약

 

 

 

여기까지 OAuth2에 대해 알아봤는데요.

 

OAuth2는 복잡해 보여도, "권한을 안전하게 위임하는 과정"이니 어려워도 알아가면 좋을 것 같아요.

'Backend > Java' 카테고리의 다른 글

영속성 컨텍스트 (Persistence Context)  (1) 2025.12.14
Spring Boot - Mustache  (0) 2025.12.12
RESTful API  (0) 2025.09.07
@Transactional  (0) 2025.09.04
Spring Security - Filter, Provider, Config  (0) 2025.09.02