๐Ÿ’ป PROJECT/[Spring Boot, React] ๋…์„œ ์Šต๊ด€ ๊ด€๋ฆฌ ์„œ๋น„์Šค

[ํ”„๋กœ์ ํŠธ] POSTMAN์—์„œ JWT ํ† ํฐ ์ž๋™ ์ €์žฅ ๋ฐ ์š”์ฒญ์— ์ž๋™ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

devCloud 2026. 5. 4. 10:10
728x90
PROJECT

Postman์—์„œ JWT ํ† ํฐ ์ž๋™ ์ €์žฅ ๋ฐ ์ ์šฉ ์„ค์ •

1. ๊ฐœ์š”

๋กœ๊ทธ์ธ API ํ˜ธ์ถœ ์‹œ ์‘๋‹ต์œผ๋กœ ๋‚ด๋ ค์˜ค๋Š” accessToken์„ Postman ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ž๋™์œผ๋กœ ์ €์žฅํ•˜๊ณ , ์ดํ›„ ์ธ์ฆ์ด ํ•„์š”ํ•œ ๋ชจ๋“  API ์š”์ฒญ์— ์ž๋™์œผ๋กœ Bearer Token์„ ๋ถ™์ด๋Š” ์„ค์ • ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด ์„ค์ •์„ ํ•ด๋‘๋ฉด ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ์‘๋‹ต์—์„œ ํ† ํฐ์„ ๋ณต์‚ฌํ•œ ๋’ค, ๋‹ค๋ฅธ ์š”์ฒญ์˜ Authorization ํ—ค๋”์— ์ง์ ‘ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

2. ๋ฐฐ๊ฒฝ ์ง€์‹

JWT & AccessToken์ด๋ž€?

JWT(JSON Web Token)๋Š” ์„œ๋ฒ„๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐœ๊ธ‰ํ•˜๋Š” ์ธ์ฆ ํ† ํฐ์ด๋‹ค. ์ด ์ค‘ AccessToken์€ ์‹ค์ œ API ์š”์ฒญ ์‹œ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์ž„์„ ์ฆ๋ช…ํ•˜๋Š” ํ† ํฐ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ AccessToken์€ ๋ณด์•ˆ์ƒ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์งง๊ฒŒ ์„ค์ •๋œ๋‹ค. ๋ณดํ†ต 30๋ถ„์—์„œ 1์‹œ๊ฐ„ ์ •๋„๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ŠคํŠธ ์ค‘ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์„œ ์ƒˆ ํ† ํฐ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

 

Bearer๋ž€?

Bearer๋Š” HTTP ์ธ์ฆ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋‹ค. ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ํ† ํฐ์„ ์š”์ฒญ ํ—ค๋”์— ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค.

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6...

์„œ๋ฒ„๋Š” Bearer ๋’ค์— ๋ถ™์€ ํ† ํฐ์„ ํŒŒ์‹ฑํ•ด์„œ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

์™œ ์ด ์„ค์ •์ด ํ•„์š”ํ•œ๊ฐ€?

Postman์œผ๋กœ ์ธ์ฆ์ด ํ•„์š”ํ•œ API๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ, ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์—์„œ ํ† ํฐ์„ ๋ณต์‚ฌํ•œ ๋’ค ๋‹ค๋ฅธ ์š”์ฒญ ํ—ค๋”์— ๋ถ™์—ฌ๋„ฃ๋Š” ๊ณผ์ •์€ ๋ฒˆ๊ฑฐ๋กญ๋‹ค.

ํŠนํžˆ AccessToken์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜๊ณ  ํ† ํฐ์„ ๋ณต์‚ฌํ•ด์„œ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜ ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด ๋กœ๊ทธ์ธ ์š”์ฒญ ํ•œ ๋ฒˆ์œผ๋กœ ์ดํ›„ ๋ชจ๋“  ์ธ์ฆ ํ•„์š” ์š”์ฒญ์— ํ† ํฐ์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋œ๋‹ค.


3. ์„ค์ • ๋ฐฉ๋ฒ•

1. Environment ์ƒ์„ฑ

Postman ์šฐ์ธก ์ƒ๋‹จ Environments ๋ฉ”๋‰ด์—์„œ + ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ƒˆ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•œ๋‹ค.

Variable Initial Value
baseUrl http://localhost:8080
accessToken ๋น„์›Œ๋‘๊ธฐ

baseUrl์—๋Š” ๋กœ์ปฌ ์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ , accessToken์€ ๋กœ๊ทธ์ธ ํ›„ ์ž๋™ ์ €์žฅ๋˜๋„๋ก ๋น„์›Œ๋‘”๋‹ค.

 

2. ๋กœ๊ทธ์ธ ์š”์ฒญ Tests ํƒญ์— ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€

๋กœ๊ทธ์ธ ์š”์ฒญ์„ ์„ ํƒํ•œ ๋’ค Tests ํƒญ์„ ํด๋ฆญํ•˜๊ณ , ๋กœ๊ทธ์ธ ์‘๋‹ต์—์„œ accessToken์„ ๊บผ๋‚ด ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

๋กœ๊ทธ์ธ ์š”์ฒญ์˜ Tests ํƒญ์— ์‘๋‹ต์—์„œ accessToken์„ ์ถ”์ถœํ•ด ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

Postman ๋ฒ„์ „์— ๋”ฐ๋ผ Tests ๋˜๋Š” Post-response ์˜์—ญ์—์„œ ์‘๋‹ต ํ›„ ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋ฒ„ ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑํ•œ ๋’ค res.data.accessToken ๊ฐ’์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ accessToken์— ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๋‹ค.

์Šคํฌ๋ฆฝํŠธ ๋™์ž‘ ๋ฐฉ์‹

Postman์€ ์š”์ฒญ์„ Sendํ•˜๋ฉด ์‘๋‹ต์„ ๋ฐ›์€ ์งํ›„ Tests ํƒญ์— ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์‘๋‹ต์—์„œ ๊ฐ’์„ ๊บผ๋‚ด ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๋‹ค.

  • pm.response.json() — ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์‘๋‹ต ๋ฐ”๋””๋ฅผ JSON ํ˜•ํƒœ๋กœ ํŒŒ์‹ฑํ•œ๋‹ค.
  • res.data.accessToken — ํŒŒ์‹ฑํ•œ ์‘๋‹ต์—์„œ accessToken ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค.
  • pm.environment.set("accessToken", ...) — ๊บผ๋‚ธ ๊ฐ’์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ accessToken์— ์ €์žฅํ•œ๋‹ค.

์ฆ‰, ๋กœ๊ทธ์ธ ์š”์ฒญ์„ Sendํ•˜๋ฉด ์‘๋‹ต ์ˆ˜์‹  ํ›„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋™ ์‹คํ–‰๋˜๊ณ , ์ดํ›„ {{accessToken}}์„ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— ์ €์žฅ๋œ ํ† ํฐ ๊ฐ’์ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„๋‹ค.

๋กœ๊ทธ์ธ ์š”์ฒญ์„ ์„ ํƒํ•œ ๋’ค Tests ํƒญ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ณ  ๋‹ค์‹œ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์ดํ›„ ์š”์ฒญ๋งˆ๋‹ค ํ† ํฐ์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋œ๋‹ค.

 

3. ์ปฌ๋ ‰์…˜ Authorization ์„ค์ •

์ปฌ๋ ‰์…˜ ์ด๋ฆ„์„ ํด๋ฆญํ•œ ๋’ค ์šฐ์ธก Authorization ํƒญ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.

  • Type: Bearer Token
  • Token: {{accessToken}}

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ์ปฌ๋ ‰์…˜ ํ•˜์œ„์˜ ๋ชจ๋“  ์š”์ฒญ์— ์ž๋™์œผ๋กœ AccessToken์ด ๋ถ™๋Š”๋‹ค.

์ปฌ๋ ‰์…˜ Authorization์— Bearer Token ํƒ€์ž…์„ ์„ ํƒํ•˜๊ณ , Token ๊ฐ’์œผ๋กœ {{accessToken}}์„ ์„ค์ •ํ•œ ํ™”๋ฉด์ด๋‹ค.


4. Refresh Token ์ฒ˜๋ฆฌ

Refresh Token์ด HttpOnly ์ฟ ํ‚ค๋กœ ๋‚ด๋ ค์˜ค๋Š” ๊ฒฝ์šฐ์—๋Š” Postman์ด ์ฟ ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Refresh Token์„ ๋ณ„๋„๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

/auth/reissue ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ Postman์ด ์ €์žฅ๋œ ์ฟ ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ํ•จ๊ป˜ ์ „์†กํ•˜๋ฏ€๋กœ, ์„œ๋ฒ„๋Š” ์ฟ ํ‚ค์— ๋‹ด๊ธด Refresh Token์„ ์ด์šฉํ•ด AccessToken์„ ์žฌ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

AccessToken์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๊ณ , Refresh Token์€ HttpOnly ์ฟ ํ‚ค๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋ผ๋ฉด Postman์—์„œ๋„ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ์ธ์ฆ ํ๋ฆ„๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

5. ์ฐธ๊ณ 

  • Postman ๋ฒ„์ „์— ๋”ฐ๋ผ ์ปฌ๋ ‰์…˜ Edit ๋ฉ”๋‰ด ์œ„์น˜๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ปฌ๋ ‰์…˜ ์ด๋ฆ„์„ ์ง์ ‘ ํด๋ฆญํ•˜๋ฉด ์šฐ์ธก์— Authorization, Variables, Scripts ๋“ฑ์˜ ํƒญ์ด ์—ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ {{accessToken}}์ด ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค.
  • ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋‹ค์‹œ ๋ณด๋‚ด ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ƒˆ AccessToken์„ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.
728x90