회원가입

POST /auth/signup

서비스를 이용하기 위한 신규 회원 가입을 진행합니다.

Request Fields

Path Type Description

username

String

아이디 (4-10자 소문자/숫자)

phone

String

전화번호 (010-XXXX-XXXX)

email

String

이메일

password

String

비밀번호 (8-15자 영문/숫자/특수문자)

name

String

실명

nickname

String

닉네임

role

String

사용자 권한 (CUSTOMER, OWNER 등)

address

Object

기본 주소 정보

address.roadAddress

String

도로명 주소

address.detailAddress

String

상세 주소

address.sidoCode

String

시도 코드

address.sidoName

String

시도 이름

address.sigunguCode

String

시군구 코드

address.sigunguName

String

시군구 이름

address.dongCode

String

동 코드

address.dongName

String

동 이름

address.description

String

장소 설명 (선택)

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

code

String

응답 코드

message

String

응답 메시지

status

String

HTTP 상태

timestamp

String

응답 타임스탬프

data.userId

String

생성된 사용자 UUID

data.username

String

사용자 아이디

data.nickname

String

닉네임

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

username

String

아이디

password

String

비밀번호

Response Headers

Name Description

Authorization

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

code

String

응답 코드

message

String

응답 메시지

status

String

HTTP 상태

timestamp

String

응답 타임스탬프

data.accessToken

String

Access Token

data.refreshToken

String

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

refreshToken

String

유효한 Refresh Token

Response Headers

Name Description

Authorization

새로운 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

code

String

응답 코드

message

String

응답 메시지

status

String

HTTP 상태

timestamp

String

응답 타임스탬프

data.accessToken

String

새로운 Access Token

data.refreshToken

String

새로운 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

code

String

응답 코드

message

String

응답 메시지

status

String

HTTP 상태

timestamp

String

응답 타임스탬프

data

Null

응답 데이터 (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"
}