
사용자가 "네이버 로그인" 버튼 클릭
-> 서버(또는 프론트)는 네이버 인증 URL로 리다이렉트 시킴
https://nid.naver.com/oauth2.0/authorize?
response_type=code
&client_id=...
&redirect_uri=서버의콜백URL
&state=랜덤값
사용자가 네이버 로그인 승인 후,
네이버가 code와 state를 포함해서 서버 콜백 URL로 리다이렉트 함
GET /oauth/naver/callback/?code=인증코드&state=랜덤값
서버는 받은 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"
}
발급받은 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": "홍길동"
}
}
서버는 받은 id(네이버 고유 ID) 또는 email 기준으로
기존 유저가 있는지 확인함
마지막으로 로그인 성공 응답을 클라이언트(브라우저, 앱 등)에 전달
(예: 자체 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 토큰)
[✅ 클라이언트 → 사용자]
- 로그인 완료 상태로 전환
