Skip to content

Auth API

JeongHyeon Kim edited this page Dec 7, 2025 · 5 revisions

๐Ÿ“˜ Auth API (Minimal Spec - v1)

1. ํšŒ์›๊ฐ€์ž…

POST /api/v1/auth/signup

์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ฅ Request

Body

{
  "email": "[email protected]",
  "password": "P@ssw0rd!",
  "nickName": "Beemo",
  "phoneNumber": "010-1234-5678"
}

๐Ÿ“ค Response (201 Created)

{
  "id": 1,
  "email": "[email protected]",
  "nickName": "Beemo",
  "phoneNumber": "010-1234-5678",
  "createdAt": "2025-01-30T12:00:00"
}

๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์‘๋‹ต์— ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


2. ๋กœ๊ทธ์ธ

POST /api/v1/auth/login

์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธํ•˜๊ณ  JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค.


๐Ÿ“ฅ Request

Body

{
  "email": "[email protected]",
  "password": "P@ssw0rd!"
}

๐Ÿ“ค Response (200 OK)

{
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "tokenType": "Bearer",
  "expiresIn": 3600, //1์‹œ๊ฐ„
  "user": {...}
}

Set-Cookie: refreshToken={value}; Max-Age=604800; Expires=Sun, 14 Dec YYYY HH:MM:SS GMT; Path=/; Secure; HttpOnly; SameSite=Strict

  • refreshToken์˜ ๊ฒฝ์šฐ HttpOnly Cookie๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • accessToken : ์ดํ›„ ์š”์ฒญ ์‹œ Authorization: Bearer {accessToken} ํ—ค๋”์— ๋„ฃ์–ด ์‚ฌ์šฉ

  • tokenType : ๋ณดํ†ต "Bearer" ๊ณ ์ •

  • expiresIn : access token ๋งŒ๋ฃŒ ์‹œ๊ฐ„(์ดˆ ๋‹จ์œ„, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)

  • user : ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์ •๋ณด


3. ๋กœ๊ทธ์•„์›ƒ

POST /api/v1/auth/logout

ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์˜ Refresh Token์„ ๋ฌดํšจํ™”ํ•˜๊ณ , ์„ธ์…˜์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ฅ Request

Cookie

  • refreshToken

๐Ÿ“ค Response (204 No Content)


4. ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰

POST /api/v1/auth/refresh

๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์ธ์ฆ์„ ํ†ตํ•ด ์—‘์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ฅ Request

Cookie

  • refreshToken

๐Ÿ“ค Response (200 OK)

{
  "accessToken": "eyJhbGciOiJIUzI1NiJ9....",
  "tokenType": "Bearer",
  "expiresIn": 3600,
  "expiresAt": "2025-12-07T20:55:10.113808"
}

๐Ÿ“š ์ฐธ๊ณ  ๋ฌธ์„œ

Clone this wiki locally