OAuth(소셜 로그인)

SW·2025년 10월 27일
post-thumbnail

OAuth 로그인 플로우

예시) 네이버

1. 클라이언트 -> 서버

사용자가 "네이버 로그인" 버튼 클릭
-> 서버(또는 프론트)는 네이버 인증 URL로 리다이렉트 시킴

https://nid.naver.com/oauth2.0/authorize?
response_type=code
&client_id=...
&redirect_uri=서버의콜백URL
&state=랜덤값

2. 네이버 -> 서버 (콜백)

사용자가 네이버 로그인 승인 후,
네이버가 code와 state를 포함해서 서버 콜백 URL로 리다이렉트 함

GET /oauth/naver/callback/?code=인증코드&state=랜덤값

3. 서버 -> 네이버 (토큰 요청)

서버는 받은 code, client_id, client_secret를 이용해
Access Token 발급 요청을 보냄

POST https://nid.naver.com/oauth2.0/token
grant_type=authorization_code
client_id=...
client_secret=...
code=...
state=...

응답 예시:

{
"access_token": "AAAABBBBCCCC...",
"refresh_token": "DDDDEEEEFFFF...",
"token_type": "bearer",
"expires_in": "3600"
}

4. 서버 -> 네이버 (프로필 요청)

발급받은 Access Token을 Authorization 헤더를 담아서
유저 정보 API에 요청합니다.

GET https://openapi.naver.com/v1/nid/me
Authorization: Bearer AAAABBBBCCCC...

응답 예시:

{
"resultcode": "00",
"message": "success",
"response": {
"id": "32749237",
"email": "example@naver.com",
"nickname": "홍길동"
}
}

5. 서버 내부 처리

서버는 받은 id(네이버 고유 ID) 또는 email 기준으로
기존 유저가 있는지 확인함

  • 있으면: 로그인 처리(세션/JWT발급)
  • 없으면: 신규 유저 생성 -> 랜덤 비번 혹은 set_unusable_password()
    set_unusable_password: 로그인 실패 처리

6. 서버 -> 클라이언트

마지막으로 로그인 성공 응답을 클라이언트(브라우저, 앱 등)에 전달
(예: 자체 JWT 토큰 or 세션 쿠키 발급)

📟 전체 흐름 요약

[ 사용자 ]
-> [ 네이버 로그인 버튼 클릭 ] 로그인 페이지로 redirect
-> [ 네이버 로그인 페이지 ] (code, state 반환)
-> [ 서버 콜백 URL ] (code 받음)
-> [ 네이버 토큰 요청 ] (access_token 획득)
-> [ 네이버 프로필 요청 ] (사용자 정보 획득)
-> [ DB 유저 확인/생성 ] (세션 or JWT 발급)
-> [ 클라이언트 로그인 완료 ]

[1️⃣ 사용자 → 클라이언트(브라우저)]
   - 사용자가 "네이버로 로그인" 버튼 클릭

[2️⃣ 클라이언트 → 서버]
   - GET /oauth/naver/login
     → 서버가 네이버 인증 URL을 생성
       (client_id, redirect_uri, state 포함)
     → 네이버 로그인 페이지로 Redirect (302)

[3️⃣ 서버 → 네이버 OAuth]
   - 네이버 로그인/동의 화면 표시
   - 사용자가 로그인 완료 시
     → 네이버가 인증 코드(code)와 state를
       redirect_uri로 전달

[4️⃣ 네이버 → 서버 콜백]
   - GET /oauth/naver/callback?code=...&state=...
     → 서버는 state 검증 (CSRF 방지)
     → code를 이용해 Access Token 요청 준비

[5️⃣ 서버 → 네이버 OAuth (토큰 요청)]
   - POST https://nid.naver.com/oauth2.0/token
     grant_type=authorization_code
     client_id=...
     client_secret=...
     code=...
     state=...

[6️⃣ 네이버 → 서버]
   - JSON 응답
     {
       "access_token": "AAAABBBBCCCC",
       "refresh_token": "DDDDEEEEFFFF",
       "token_type": "bearer",
       "expires_in": "3600"
     }

[7️⃣ 서버 → 네이버 (프로필 요청)]
   - GET https://openapi.naver.com/v1/nid/me
     Authorization: Bearer <access_token>

[8️⃣ 네이버 → 서버]
   - JSON 응답
     {
       "resultcode": "00",
       "message": "success",
       "response": {
         "id": "32749237",
         "email": "example@naver.com",
         "nickname": "홍길동"
       }
     }

[9️⃣ 서버 내부 처리]
   - response.id 또는 email 기준으로 유저 조회
   - 없으면 새로 생성:
       user = User.objects.create_user(
           username=...,
           email=...,
           password=None or get_random_string()
       )
   - 소셜 로그인 전용이면:
       user.set_unusable_password()
   - 로그인 세션 or 자체 JWT 발급

[🔟 서버 → 클라이언트]
   - 로그인 완료 응답 전송
     (세션 쿠키 or JWT 토큰)

[✅ 클라이언트 → 사용자]
   - 로그인 완료 상태로 전환

profile
코딩 새싹

0개의 댓글