회원가입
POST /auth/signup
서비스를 이용하기 위한 신규 회원 가입을 진행합니다.
Request Fields
| Path | Type | Description |
|---|---|---|
|
|
아이디 (4-10자 소문자/숫자) |
|
|
전화번호 (010-XXXX-XXXX) |
|
|
이메일 |
|
|
비밀번호 (8-15자 영문/숫자/특수문자) |
|
|
실명 |
|
|
닉네임 |
|
|
사용자 권한 (CUSTOMER, OWNER 등) |
|
|
기본 주소 정보 |
|
|
도로명 주소 |
|
|
상세 주소 |
|
|
시도 코드 |
|
|
시도 이름 |
|
|
시군구 코드 |
|
|
시군구 이름 |
|
|
동 코드 |
|
|
동 이름 |
|
|
장소 설명 (선택) |
HTTP Request Example
POST /auth/signup HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 552
Host: localhost:8080
{
"username" : "tester123",
"phone" : "010-1234-5678",
"email" : "tester123@baedalsodae.com",
"password" : "Password123!",
"name" : "테스터",
"nickname" : "닉네임",
"role" : "CUSTOMER",
"address" : {
"sidoCode" : "11",
"sidoName" : "서울특별시",
"sigunguCode" : "11680",
"sigunguName" : "강남구",
"dongCode" : "1168010100",
"dongName" : "역삼동",
"roadAddress" : "서울특별시 강남구 테헤란로 427",
"detailAddress" : "위워크 타워 10층",
"description" : "회사"
}
}
Response Fields
| Path | Type | Description |
|---|---|---|
|
|
응답 코드 |
|
|
응답 메시지 |
|
|
HTTP 상태 |
|
|
응답 타임스탬프 |
|
|
생성된 사용자 UUID |
|
|
사용자 아이디 |
|
|
닉네임 |
HTTP Response Example
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 264
{
"code" : "UR201",
"status" : "CREATED",
"message" : "회원가입 성공",
"data" : {
"userId" : "146b44b9-a9db-4c49-8ac2-fd57b140d337",
"username" : "tester123",
"nickname" : "닉네임"
},
"timestamp" : "2026-03-11T10:09:54.398141279"
}
회원가입 실패 (아이디 중복)
HTTP Response Example
HTTP/1.1 409 Conflict
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 170
{
"code" : "U004",
"status" : "CONFLICT",
"message" : "이미 사용 중인 아이디입니다.",
"data" : null,
"timestamp" : "2026-03-11T10:09:53.940411337"
}
회원가입 실패 (이메일 중복)
HTTP Response Example
HTTP/1.1 409 Conflict
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 166
{
"code" : "U002",
"status" : "CONFLICT",
"message" : "이미 가입된 이메일입니다.",
"data" : null,
"timestamp" : "2026-03-11T10:09:54.239345302"
}
로그인
POST /auth/login
아이디와 비밀번호로 로그인하고 토큰을 발급받습니다.
Request Fields
| Path | Type | Description |
|---|---|---|
|
|
아이디 |
|
|
비밀번호 |
Response Headers
| Name | Description |
|---|---|
|
Access Token (Bearer) |
HTTP Request Example
POST /auth/login HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 61
Host: localhost:8080
{
"username" : "tester123",
"password" : "Password123!"
}
Response Fields
| Path | Type | Description |
|---|---|---|
|
|
응답 코드 |
|
|
응답 메시지 |
|
|
HTTP 상태 |
|
|
응답 타임스탬프 |
|
|
Access Token |
|
|
Refresh Token |
HTTP Response Example
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0ZXIxMjMiLCJhdXRoIjoiUk9MRV_Q1VSTE9NRVIiLCJpYXQiOjE3MTI3MTIzNDUsImV4cCI6MTcxMjcxNTk0NX0.mock-signature
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 361
{
"code" : "AU200",
"status" : "OK",
"message" : "로그인 성공",
"data" : {
"accessToken" : "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0ZXIxMjMiLCJhdXRoIjoiUk9MRV_Q1VSTE9NRVIiLCJpYXQiOjE3MTI3MTIzNDUsImV4cCI6MTcxMjcxNTk0NX0.mock-signature",
"refreshToken" : "def-456-refresh-token-mock"
},
"timestamp" : "2026-03-11T10:09:54.315219852"
}
로그인 실패 (비밀번호 불일치)
HTTP Response Example
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 180
{
"code" : "Z009",
"status" : "UNAUTHORIZED",
"message" : "로그인 요청 처리에 실패했습니다.",
"data" : null,
"timestamp" : "2026-03-11T10:09:54.058432452"
}
토큰 재발급
POST /auth/reissue
Refresh Token을 사용하여 만료된 Access Token을 재발급받습니다. 반드시 Refresh Token 타입의 토큰을 사용해야 합니다.
Request Fields
| Path | Type | Description |
|---|---|---|
|
|
유효한 Refresh Token |
Response Headers
| Name | Description |
|---|---|
|
새로운 Access Token (Bearer) |
HTTP Request Example
POST /auth/reissue HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 51
Host: localhost:8080
{
"refreshToken" : "def-456-refresh-token-mock"
}
Response Fields
| Path | Type | Description |
|---|---|---|
|
|
응답 코드 |
|
|
응답 메시지 |
|
|
HTTP 상태 |
|
|
응답 타임스탬프 |
|
|
새로운 Access Token |
|
|
새로운 Refresh Token |
HTTP Response Example
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0ZXIxMjMiLCJhdXRoIjoiUk9MRV_Q1VSTE9NRVIiLCJpYXQiOjE3MTI3MTIzNDUsImV4cCI6MTcxMjcxNTk0NX0.mock-signature
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 361
{
"code" : "AU200",
"status" : "OK",
"message" : "로그인 성공",
"data" : {
"accessToken" : "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0ZXIxMjMiLCJhdXRoIjoiUk9MRV_Q1VSTE9NRVIiLCJpYXQiOjE3MTI3MTIzNDUsImV4cCI6MTcxMjcxNTk0NX0.mock-signature",
"refreshToken" : "def-456-refresh-token-mock"
},
"timestamp" : "2026-03-11T10:09:54.130450605"
}
토큰 재발급 실패 (만료된 토큰)
HTTP Response Example
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 164
{
"code" : "Z007",
"status" : "UNAUTHORIZED",
"message" : "만료된 JWT 토큰입니다.",
"data" : null,
"timestamp" : "2026-03-11T10:09:54.364572759"
}
토큰 재발급 실패 (유효하지 않은 토큰)
HTTP Response Example
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 174
{
"code" : "Z006",
"status" : "UNAUTHORIZED",
"message" : "유효하지 않은 JWT 토큰입니다.",
"data" : null,
"timestamp" : "2026-03-11T10:09:54.284299941"
}
토큰 재발급 실패 (Access Token을 사용한 경우)
HTTP Response Example
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 174
{
"code" : "Z006",
"status" : "UNAUTHORIZED",
"message" : "유효하지 않은 JWT 토큰입니다.",
"data" : null,
"timestamp" : "2026-03-11T10:09:54.185082219"
}
로그아웃
POST /auth/logout
현재 로그인된 세션을 종료하고 토큰을 무효화합니다. Access Token이 만료된 상태에서도 정상적으로 로그아웃이 가능합니다.
HTTP Request Example
POST /auth/logout HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0ZXIxMjMiLCJhdXRoIjoiUk9MRV_Q1VSTE9NRVIiLCJpYXQiOjE3MTI3MTIzNDUsImV4cCI6MTcxMjcxNTk0NX0.mock-signature
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Fields
| Path | Type | Description |
|---|---|---|
|
|
응답 코드 |
|
|
응답 메시지 |
|
|
HTTP 상태 |
|
|
응답 타임스탬프 |
|
|
응답 데이터 (null) |
HTTP Response Example
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 146
{
"code" : "SUCCESS",
"status" : "OK",
"message" : "로그아웃 성공",
"data" : null,
"timestamp" : "2026-03-11T10:09:53.997573259"
}
로그아웃 성공 (만료된 토큰으로 시도 시)
HTTP Response Example
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 146
{
"code" : "SUCCESS",
"status" : "OK",
"message" : "로그아웃 성공",
"data" : null,
"timestamp" : "2026-03-11T10:09:54.094618262"
}
로그아웃 실패 (인증되지 않은 요청)
HTTP Response Example
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 171
{
"code" : "Z003",
"status" : "UNAUTHORIZED",
"message" : "요청을 인가할 수 없습니다.",
"data" : null,
"timestamp" : "2026-03-11T10:09:54.440222521"
}