๐Ÿ“JWT, API์— ๋Œ€ํ•ด

์ด์ง„ํฌยท2022๋…„ 5์›” 15์ผ
0

๊ฐœ๋…์ •๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
1/10

๐Ÿ‘ฃ JWT ํ† ํฐ์ด๋ž€?

JWT ํ† ํฐ์€ JSON Web Token์˜ ์•ฝ์ž๋กœ ์ „์ž ์„œ๋ช…๋œ URL-safe์˜ JSON์ด๋‹ค.

์›๋ž˜ ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผ ํ•  ์„ธ์…˜ ๊ฐ’์„ ๊ทธ๋ƒฅ ๊ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ชจ๋‘ ๋„˜๊ฒจ๋ฒ„๋ฆฌ์ž๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ธ์ฆ ์‹œ์— ํ•ด๋‹น ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•  ๋ชจ๋“ˆ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ์ด๊ฒƒ ์ž์ฒด๊ฐ€ ์„ธ์…˜ ์ €์žฅ์†Œ ์ „์ฒด๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ˆ˜๋‹จ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

JWT์€ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋ฉด์„œ ์ž๊ธฐ ์ˆ˜์šฉ์ ์ด๋ผ๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

์ž๊ธฐ ์ˆ˜์šฉ์ ์ธ JWT๋Š” ์‹œ์Šคํ…œ์—์„œ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์ด ํ† ํฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ •๋ณด, ์ „๋‹ฌํ•  ๋‚ด์šฉ, ๊ทธ๋ฆฌ๊ณ  ํ† ํฐ์ด ๊ฒ€์ฆ๋๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•ด์ค€๋‹ค.

JWT๋Š” ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ ์„ฑ์„ ์ž…์ฆํ•  ๋งŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ์žฅํ•˜์—ฌ ํ† ํฐ์„ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก๋ฐ›์•˜์„ ๋•Œ,

ํ•ด๋‹น ํ† ํฐ์•ˆ์— ๋“ค์–ด์žˆ๋˜ ๊ณ ์œ  ๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜์—ฌ,

๋ณ„๋„์˜ ์ธ์ฆ ๊ณผ์ •์—†์ด ๋ฐ”๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

JWT๋Š” ๋ณตํ˜ธํ™”(decoding/์•”ํ˜ธํ™”์™€ ๋ฐ˜๋Œ€๋Œ€๋Š” ๋ง)๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— SECRET_KEY๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

(๋ณด์•ˆ์ทจ์•ฝ, ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.)

JWT๋Š” .์„ ๊ธฐ์ค€์œผ๋กœ ์„ธ ํŒŒํŠธ๋กœ ๋‚˜๋‰œ๋‹ค.

๐Ÿ“Header

{
 	"alg": "์„œ๋ช… ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜",
	"kid": "์„œ๋ช… ์‹œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’",
      	"typ": "ํƒ€์ž…"
}

ํ—ค๋”(Header)์—๋Š” JWT๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

ํ† ํฐ์˜ ํƒ€์ž…, ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.

ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ด๋ฆ„์„ ์ ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“payload

{
	"sub": "jinhui,Lee",
    	"exp": 4561232123,
    	"iat": 1234568734
}

ํ† ํฐ์— ๋‹ด์•„์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๊ณณ์— ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค.

์ด ์ •๋ณด์˜ ์กฐ๊ฐ์€ ํด๋ ˆ์ž„(claim) ์ด๋ผ๊ณ  ํ•˜๊ณ , key - value์˜ ํ•œ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  payload์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ ˆ์ž„์„ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ ,

ํด๋ ˆ์ž„์„ ๊ณต๊ฐœ(public) ํ˜น์€ ๋น„๊ณต๊ฐœ(private) ํ•  ๊ฒƒ์ธ์ง€ ๋“ฑ๋ก(registered)ํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“signature

header+paylode

์‹œ๊ทธ๋‹ˆ์ฒ˜(signature)์—๋Š” ์œ„์˜ ํ—ค๋”(header)์™€ ํŽ˜์ด๋กœ๋“œ(Paylaod)๋ฅผ ํ•ฉ์นœ ๋ฌธ์ž์—ด์„ ์„œ๋ช…ํ•œ ๊ฐ’์ด๋‹ค.

์„œ๋ช…์€ ํ—ค๋”์˜ alg์— ์ •์˜๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ secret key๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ•˜๊ณ  Base64 URL-Safe๋กœ ์ธ์ฝ”๋”ฉํ•œ๋‹ค.

secret key๋ฅผ ํฌํ•จํ•ด์„œ ์•”ํ˜ธํ™”๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

์ƒ์„ฑ๋œ JWT๋Š” ์ (.)์„ ๊ตฌ๋ถ„์ž๋กœ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ์‹œ๊ทธ๋‹ˆ์ณ๋กœ ๋‚˜๋ˆ ์„œ ์„œ๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๊ณ ,

์„œ๋ฒ„๋Š” ํ—ค๋”์˜ alg, kid ์†์„ฑ๊ณผ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ด์šฉํ•ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒ€์ฆ(์ด ํ† ํฐ์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ† ํฐ์ธ๊ฐ€?)๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ํŽ˜์ด๋กœ๋“œ์˜ ๊ฐ’์œผ๋กœ ์ ‘๊ทผ์„ ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.!

๐Ÿ“Œ JWT์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  1. ์„ธ์…˜ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ณ„๋„์˜ ์ธ์ฆ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š” ์—†์–ด์„œ ์„œ๋ฒ„์™€์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์ตœ์†Œํ•œ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์ด ์ ๋‹ค.

  3. ์„ธ์…˜๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋…๋ฆฝ์ ์ธ ๋Š๋‚Œ์˜ JWT๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ.

๋‹จ์ 

  1. JWT์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ฑฐ์˜ ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ „์†ก๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ํŠธ๋ž˜ํ”ฝ ํฌ๊ธฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

  2. ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— DB์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ํ† ํฐ์— ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๐Ÿค“API๋ž€ ๋ฌด์—‡์ธ๊ฐ€!?

API๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ๋Š” ๋งค๊ฐœ์ฒด!

โœ”๏ธAPI์˜ ์žฅ์ !

Pirvate API๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ,
๊ฐœ๋ฐœ์ž๋“ค์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ‘œ์ค€ํ™”ํ•จ์œผ๋กœ์จ,
๊ฐ„์†Œํ™”๋˜๊ณ  ๋น ๋ฅธ ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
์†Œํ”„ํŠธ ์›จ์–ด๋ฅผ ํ†ตํ•ฉํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ๊ฐœ๋ฐœ์ž๋“ค ๊ฐ„์˜ ํ˜‘์—…์„ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

Pubilc API์™€ Partner API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด,
๊ธฐ์—…์€ ํƒ€์‚ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ธŒ๋žœ๋“œ ์ธ์ง€๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๊ณ ,
๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™•์žฅํ•˜์—ฌ ์ „ํ™˜์œจ๊นŒ์ง€ ๋†’์ผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

โœ”๏ธAPI์˜ ์—ญํ• โœจ

  1. ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ถœ์ž…๊ตฌ ์—ญํ• ์„ ํ•œ๋‹ค.

  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ธฐ๊ธฐ๊ฐ€ ์„œ๋กœ ์›ํ™œํ•˜๊ฒŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  3. ๋ชจ๋“  ์ ‘์†์„ ํ‘œ์ค€ํ™” ํ•œ๋‹ค.

โœ”๏ธAPI์˜ ์ข…๋ฅ˜

1. private API
: ๋‚ด๋ถ€API๋กœ, ํšŒ์‚ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์ฒด ์ œํ’ˆ๊ณผ ์„œ๋น„์Šค๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐœํ–‰ํ•œ๋‹ค.
(์ œ3์ž์—๊ฒŒ ๋…ธ์ถœ X)

2. pubilc API
: ๊ฐœ๋ฐฉํ˜• API๋กœ, ๋ชจ๋‘์—๊ฒŒ ๊ณต๊ฐœ๋œ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ์ œํ•œ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค!

3. partner API
: ๊ธฐ์—…์ด ๋ฐ์ดํ„ฐ ๊ณต์œ ์— ๋™์˜ํ•˜๋Š” ํŠน์ •์ธ๋“ค๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๊ด€๊ณ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŽธ์ด๋ฉฐ,
์ข…์ข… ํŒŒํŠธ๋„ˆ ํšŒ์‚ฌ ๊ฐ„์— ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€