๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ธฐํƒ€/๊ฐœ๋ฐœ?

[Postman] API access token ์ž๋™ํ™”ํ•˜๊ธฐ

by ์ ผ์ ผ39 2026. 3. 19.
ํ”„๋กœ์ ํŠธ ํ•  ๋•Œ ๋งˆ๋‹ค Postman์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ๋•Œ ๋กœ๊ทธ์ธํ•˜๊ณ  Authorization ํ•„์š”ํ•œ api๋งˆ๋‹ค ํ•˜๋‚˜ํ•˜๋‚˜ access token ๊ฐ’ ๊ธ์–ด ๋„ฃ๋Š” ๊ฒŒ ๋„ˆ๋ฌด๋„ˆ๋ฌด ๊ท€์ฐฎ์•„์„œ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ ์•Œ๊ฒŒ๋๋‹ค
Swagger ์‚ฌ์šฉํ• ๊ฑฐ๋ผ๋ฉด ์ƒ๊ด€์—†๊ธด ํ•˜์ง€๋งŒ ์ง์ „์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Swagger๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ฉ” ์ˆ˜ ์—†์—ˆ๋‹ค

 

0. Swagger๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ 

[1] ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์˜ ์˜ค์—ผ (Dependency & Security)

: Swagger๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘(Runtime)์ผ ๋•Œ ํ•จ๊ป˜ ๊ตฌ๋™๋จ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์นจํˆฌ: Swagger ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์— ํฌํ•จ๋˜์–ด ์‹ค์ œ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜๊ณ  ๊ตฌ๋™ ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ์คŒ
  • ๋ณด์•ˆ ์ทจ์•ฝ์ : ์„ค์ • ์‹ค์ˆ˜๋กœ ์šด์˜(Production) ํ™˜๊ฒฝ์—์„œ Swagger UI๊ฐ€ ๋…ธ์ถœ๋  ๊ฒฝ์šฐ, API ๊ตฌ์กฐ๋Š” ๋ฌผ๋ก  ํ…Œ์ŠคํŠธ ํ˜ธ์ถœ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‹ค๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ถœ๋˜๊ฑฐ๋‚˜ ์กฐ์ž‘๋  ์œ„ํ—˜์ด ์žˆ์Œ
  • ๋ฐ˜๋ฉด RestDocs๋Š”: ๋นŒ๋“œ ์‹œ์ ์— ๋ฌธ์„œ(์ •์  ํŒŒ์ผ)๋ฅผ ๋งŒ๋“ค๊ณ  ๋น ์ง. ์‹ค์ œ ์„œ๋ฒ„๊ฐ€ ๋Œ์•„๊ฐˆ ๋•Œ๋Š” ๋ฌธ์„œํ™” ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์•„์˜ˆ ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์œ ์ง€๋จ

[2] ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์™€ ์‹ค๋ฐ์ดํ„ฐ์˜ ํ˜ผ์žฌ

: Swagger์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ธ 'Try it out' ๊ธฐ๋Šฅ์ด ์—ญ์„ค์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์˜ค์—ผ์˜ ์›์ธ์ด ๋จ

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์„œ๋ฅผ ๋ณด๋‹ค๊ฐ€ ๋ฌด์‹ฌ์ฝ” 'Execute' ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์šด์˜ DB๋‚˜ ๊ณต์šฉ ๊ฐœ๋ฐœ DB์— ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ•์•„๋„ฃ๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์Œ
  • RestDocs: RestDocs๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ '์ฝ๊ธฐ ์ „์šฉ' ๋ฌธ์„œ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‚ ๋ ค๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋ฌธ์„œ ํ™•์ธ ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๋กœ DB ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋ฆฌ์Šคํฌ๊ฐ€ ์›์ฒœ ์ฐจ๋‹จ๋จ

[3] ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฐ€๋…์„ฑ ์ €ํ•ด

  • ํด๋ฆฐ ์ฝ”๋“œ ๊ด€์ ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ํ๋ฆ„์„ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š”๋ฐ Swagger๋ฅผ ์“ฐ๋ฉด ์ฝ”๋“œ์˜ 70~80%๊ฐ€ ๋ฌธ์„œ์šฉ ์„ค์ •๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ง
    • @ApiOperation, @ApiResponse ๋“ฑ ๋กœ์ง๊ณผ ์ƒ๊ด€์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ๋ณด๋‹ค ๊ธธ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
  • ์ง„์งœ ์ค‘์š”ํ•œ ๋กœ์ง(Validation, Service Call ๋“ฑ)์ด ๋ฌธ์„œ์šฉ ์ฝ”๋“œ์— ํŒŒ๋ฌปํ˜€ ๋ฒ„๋ ค, ์œ ์ง€๋ณด์ˆ˜ ์‹œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ์ง

[4] ๋ฌธ์„œ์˜ ์‹ ๋ขฐ๋„ (ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ•„์ˆ˜)

: ๋ฌธ์„œ์™€ ์‹ค์ œ API๊ฐ€ ๋”ฐ๋กœ ๋…ธ๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ

  • Swagger: ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์–ด๋…ธํ…Œ์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•„๋„ ์„œ๋ฒ„๋Š” ์ž˜ ๋Œ์•„๊ฐ. ์ˆ˜์ •๋œ๊ฒƒ์— ๋Œ€ํ•œ ํ™•์ธ์ด ์ˆ˜๋™์ž„
  • RestDocs: API ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ๋งŒ ๋ฌธ์„œ๊ฐ€ ์ƒ์„ฑ๋จ. ๊ธฐ๋Šฅ์ด ๋ฐ”๋€Œ์—ˆ๋Š”๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋นŒ๋“œ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•˜๋ฏ€๋กœ, ๋ฌธ์„œ๋Š” ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ์™€ ์ •ํ™•์„ฑ์„ ๋ณด์žฅ๋ฐ›์Œ

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ํ•ด๋‘๊ณ  ์ •์ž‘ Spring Rest Docs๋Š” ์•„์ง ๋ชป ์จ๋ดค๋‹คใ…‹ใ…‹ใ…‹ใ…‹ ํ”„๋ก ํŠธ์—”๋“œ ์—†๋Š” ํ”„๋กœ์ ํŠธ๋ผ์„œ ํฐ ๋ฌธ์ œ๋Š” ์—†์—ˆ์ง€๋งŒ

 

1. ์ ์šฉ๋ฐฉ๋ฒ•

Postman Scripts

  • Postman์˜ Scripts(๋˜๋Š” Tests) ํƒญ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, API ์‘๋‹ต์ด ์˜ฌ ๋•Œ ํŠน์ • ๊ฐ’์„ ์ถ”์ถœํ•ด Postman์˜ ์ „์—ญ ๋ณ€์ˆ˜(Globals)์— ์ž๋™์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ.

CASE A: Access Token๋งŒ ๋ฐ›๋Š” ๊ฒฝ์šฐ

์„œ๋ฒ„ ์‘๋‹ต JSON์˜ ํ‚ค๊ฐ’์ด access_token์ธ ๊ฒฝ์šฐ์ž„.

// 1. ์‘๋‹ต ์„ฑ๊ณต ์—ฌ๋ถ€ ํ™•์ธ
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

// 2. JSON ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ
const jsonData = pm.response.json();

// 3. ํ† ํฐ ์ถ”์ถœ ๋ฐ ์ „์—ญ ๋ณ€์ˆ˜ ์ €์žฅ
// ์„œ๋ฒ„ ์‘๋‹ต ํ‚ค๊ฐ€ access_token์ธ์ง€ accessToken์ธ์ง€ ํ™•์ธ ํ•„์ˆ˜
const token = jsonData.access_token || jsonData.accessToken;

if (token) {
    pm.globals.set("access_token", token);
    console.log("โœ… Access Token ์ €์žฅ ์™„๋ฃŒ");
}

CASE B: Refresh Token๊นŒ์ง€ ํ•จ๊ป˜ ๋ฐ›๋Š” ๊ฒฝ์šฐ

๋‘ ํ† ํฐ์„ ๋ชจ๋‘ ์ €์žฅํ•˜์—ฌ ๋‚˜์ค‘์— ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ API์—์„œ๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

const jsonData = pm.response.json();

// Access Token ์ €์žฅ
const accessToken = jsonData.access_token || jsonData.accessToken;
if (accessToken) {
    pm.globals.set("access_token", accessToken);
}

// Refresh Token ์ €์žฅ
const refreshToken = jsonData.refresh_token || jsonData.refreshToken;
if (refreshToken) {
    pm.globals.set("refresh_token", refreshToken);
    console.log("โœ… Access & Refresh Token ๋ชจ๋‘ ์ €์žฅ ์™„๋ฃŒ");
}

3. ์ „์ฒด ์ ์šฉ ๊ณผ์ •

  1. ๋กœ๊ทธ์ธ API ์„ค์ •: ๋กœ๊ทธ์ธ(๋˜๋Š” ํ† ํฐ ๋ฐœ๊ธ‰) API์˜ Scripts ํƒญ์— ์œ„ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ณ  ์ €์žฅํ•จ
  2. API ์‹คํ–‰: Send ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋ƒ„. ํ•˜๋‹จ Console ์ฐฝ์— "์ €์žฅ ์™„๋ฃŒ" ๋กœ๊ทธ๊ฐ€ ๋œจ๋Š”์ง€ ํ™•์ธํ•จ
  3. ๋ณ€์ˆ˜ ํ™•์ธ: ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ๊ฐ€๋กœ์„  ์—ฌ๋Ÿฌ๊ฐœ(variables) ์•„์ด์ฝ˜์„ ํด๋ฆญํ•ด Globals ํ•ญ๋ชฉ์— ํ† ํฐ ๊ฐ’์ด ์ž˜ ๋“ค์–ด์™”๋Š”์ง€ ํ™•์ธํ•จ.
  4. ๋‹ค๋ฅธ API์—์„œ ์‚ฌ์šฉ:
    • ํ† ํฐ์ด ํ•„์š”ํ•œ API์˜ Authorization ํƒญ์œผ๋กœ ์ด๋™ํ•จ.
    • Auth Type์„ Bearer Token์œผ๋กœ ์„ ํƒํ•จ.
    • Token ํ•„๋“œ์— ์ง์ ‘ ์ž…๋ ฅ ๋Œ€์‹  {{access_token}}์„ ์ž…๋ ฅํ•จ. (๊ธ€์ž ์ƒ‰์ด ์ฃผํ™ฉ์ƒ‰์œผ๋กœ ๋ณ€ํ•ด์•ผ ์ •์ƒ์ž„)

4. ์‘๋‹ต ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ ๋Œ€์ฒ˜๋ฒ• (Troubleshooting)

๋งŒ์•ฝ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‘๋‹ต JSON ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๋ฉด ์ฝ”๋“œ์˜ ์ถ”์ถœ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•จ.

  • ํ‚ค ์ด๋ฆ„์ด ๋ฐ”๋€ ๊ฒฝ์šฐ:
    • jsonData.access_token → jsonData.data.token ๋“ฑ์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•จ.
  • ๋ณ€์ˆ˜๊ฐ€ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋œจ๋Š” ๊ฒฝ์šฐ:
    • pm.globals.set("์ด๋ฆ„", ...)์—์„œ ์„ค์ •ํ•œ ์ด๋ฆ„๊ณผ {{์ด๋ฆ„}}์— ์ ์€ ์ด๋ฆ„์ด ๋Œ€์†Œ๋ฌธ์ž๊นŒ์ง€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•จ.
  • ๊ฐ’์ด ์•ˆ ์žกํžˆ๋Š” ๊ฒฝ์šฐ:
    • Postman ์ขŒ์ธก ํ•˜๋‹จ Console์„ ์—ด์–ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , pm.response.json()์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•จ.

 

6. ๊ฒฐ๋ก 

์ด ์„ค์ •์„ ๋งˆ์น˜๋ฉด ๋กœ๊ทธ์ธ API ํ˜ธ์ถœ ํ•œ ๋ฒˆ์œผ๋กœ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ค€๋น„๊ฐ€ ๋๋‚จ!

 


 

7. ์ถ”๊ฐ€๋กœ ํ•ด๋ณผ ๊ฒƒ

๊ทผ๋ฐ ํ•„์š” ๊ถŒํ•œ์ด ๋‹ค๋ฅธ api๋“ค์„ ์žฌ ๋กœ๊ทธ์ธ ์—†์ด ์ด์–ด์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์„ ๋•Œ (์˜ˆ๋ฅผ ๋“ค๋ฉด, customer๋กœ ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•˜๊ณ , ์งํ›„์— master๊ฐ€ ๋ชจ๋“  customer์— ๋Œ€ํ•œ ์ „์ฒด ์ฃผ๋ฌธ์„ ํ™•์ธํ•˜๋Š” ๊ฒฝ์šฐ) ์—๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๋ฐ›์•„์•ผ ํ•˜๋‹ˆ๊นŒ... 

๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž(MANAGER/ADMIN)์ธ์ง€ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž(USER)์ธ์ง€์— ๋”ฐ๋ผ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์ €์žฅํ•˜๋ฉด, ์—ฌ๋Ÿฌ ๊ณ„์ •์˜ ํ† ํฐ์„ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ํ…Œ์ŠคํŠธํ•  ๋•Œ ํ›จ์”ฌ ํŽธํ•ด์งˆ๊ฒƒ๊ฐ™์€๋ฐ

(์•„๋ž˜๋Š” ์ง์ ‘ ํ•ด๋ณด์ง€ ์•Š์€... ์ดˆ์•ˆ? ๊ฐ™์€๊ฒ๋‹ˆ๋‹ค)

1. Role์ด String์ธ ๊ฒฝ์šฐ

  • ์„œ๋ฒ„ ์‘๋‹ต JSON์—์„œ role ๊ฐ’์ด "ADMIN", "USER" ๋“ฑ Enum์ด ์•„๋‹Œ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ
const jsonData = pm.response.json();
const token = jsonData.access_token || jsonData.accessToken;
const role = jsonData.role; // ์˜ˆ: "ADMIN", "USER", "MANAGER"

if (token && role) {
    // role ๊ฐ’์„ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณ€์ˆ˜๋ช… ์ƒ์„ฑ (์˜ˆ: admin_token, user_token)
    const variableName = `${role.toLowerCase()}_token`;
    
    pm.globals.set(variableName, token);
    console.log(`โœ… ${role} ๊ถŒํ•œ ํ† ํฐ์ด {{${variableName}}}์— ์ €์žฅ๋จ`);
}

2. Role์ด Enum์ธ ๊ฒฝ์šฐ (๊ฐ์ฒด ๊ตฌ์กฐ ๋Œ€์‘)

์ผ๋ฐ˜์ ์œผ๋กœ Java(Spring Boot) ๋“ฑ์—์„œ Enum์„ ์‚ฌ์šฉํ•˜๋ฉด, ์‘๋‹ต์ด ๋‹จ์ˆœ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ { "key": "ADMIN", "name": "๊ด€๋ฆฌ์ž" } ์‹์˜ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋‚ด๋ ค์˜ฌ ๋•Œ๊ฐ€ ๋งŽ์Œ. ์ด๋ฅผ ๊ณ ๋ คํ•œ ์ฝ”๋“œ์ž„

const jsonData = pm.response.json();
const token = jsonData.access_token || jsonData.accessToken;

// Role์ด ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ์™€ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋Œ€์‘
let roleValue;
if (typeof jsonData.role === 'object' && jsonData.role !== null) {
    roleValue = jsonData.role.key || jsonData.role.code; // Enum์˜ ํ•„๋“œ๋ช…์— ๋งž์ถฐ ์ˆ˜์ • (key ๋˜๋Š” code)
} else {
    roleValue = jsonData.role;
}

if (token && roleValue) {
    const variableName = `${roleValue.toLowerCase()}_token`;
    
    pm.globals.set(variableName, token);
    console.log(`โœ… Enum ๊ธฐ๋ฐ˜ ${roleValue} ํ† ํฐ์ด {{${variableName}}}์— ์ €์žฅ๋จ`);
}

 

์ด๋ ‡๊ฒŒ Role๋ณ„๋กœ ์ €์žฅํ•˜๋ฉด API ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ Authorization ์„ค์ •์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„ ๋“ฏ

  • ๊ด€๋ฆฌ์ž API ํ…Œ์ŠคํŠธ ์‹œ: {{admin_token}} ์‚ฌ์šฉ
  • ์ผ๋ฐ˜ ์œ ์ € API ํ…Œ์ŠคํŠธ ์‹œ: {{user_token}} ์‚ฌ์šฉ

 

์ผ๋‹จ ์ง€๊ธˆ์€ ๋กœ๊ทธ์ธ ์‹œ access token๋งŒ ๋ฆฌํ„ดํ•ด์„œ, role์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†์–ด์„œ ์ด๋ ‡๊ฒŒ๋งŒ ์ ์—ˆ๋‹ค

๋‚˜์ค‘์— ํ•ด๋ณด๊ณ  ์ถ”๊ฐ€ํ• ์ง€๋„