๐ JWT & API
๐ 1. JWT(JSON Web Token)์ ์ ์
JWT๋ ์ ์ ๋ฅผ ์ธ์ฆํ๊ณ ์๋ณํ๊ธฐ ์ํ ํ ํฐ(Token) ๊ธฐ๋ฐ ์ธ์ฆ์ด๋ค. RFC 7519์ ์์ธํ ๋ช ์ธ๊ฐ ๋์์๋ค.
ํ ํฐ์ ์ธ์ ๊ณผ๋ ๋ฌ๋ฆฌ ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ ์คํ ๋ฆฌ์ง ๋ฑ์ ํตํด ์ธ์ ์ ๊ด๋ฆฌํ๋ ์๋ฒ์ ๋ถ๋ด์ ๋ ์ ์๋ค.
JWT๊ฐ ๊ฐ์ง๋ ํต์ฌ์ ์ธ ํน์ง์ด ์๋ค๋ฉด, ํ ํฐ ์์ฒด์ ์ฌ์ฉ์์ ๊ถํ ์ ๋ณด๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ ๋ณด๊ฐ ํฌํจ(Self-contained)๋๋ค๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ํ ํฐ์ด ์ปค์ง ์ ์์ผ๋ฉฐ ํ ํฐ์ด ํ ๋ฒ ๋ฐ๊ธ๋ ์ดํ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ฐ๊พธ๋๋ผ๋ ํ ํฐ์ ์ฌ๋ฐ๊ธํ์ง ์๋ ์ด์ ๋ฐ์๋์ง ์๋๋ค.
JWT๋ฅผ ์ฌ์ฉํ๋ฉด RESTful๊ณผ ๊ฐ์ ๋ฌด์ํ(Stateless)์ธ ํ๊ฒฝ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ๋๋ค.
์ธ์ (Session)์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒฝ์ฐ์๋ ์ฟ ํค ๋ฑ์ ํตํด ์๋ณํ๊ณ ์๋ฒ์ ์ธ์ ์ ์ ์ฅํ์ง๋ง JWT์ ๊ฐ์ ํ ํฐ์ ํด๋ผ์ด์ธํธ์ ์ ์ฅํ๊ณ ์ซ์ด์ ๋จ์ํ HTTP ํค๋์ ํ ํฐ์ ์ฒจ๋ถํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋จ์ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ์๋ต์ ๋ฐ์์ฌ ์ ์๋ค.
โถ๏ธ ์ผ๋ฐ์ ์ผ๋ก JWT๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ ์์๋ก ์งํ๋๋ค.
JWT๋ JSON ๋ฐ์ดํฐ๋ฅผ Base64 URL-safe Encode๋ฅผ ํตํด ์ธ์ฝ๋ฉํ์ฌ ์ง๋ ฌํํ ๊ฒ์ด ํฌํจ๋๋ฉฐ ํ ํฐ ๋ด๋ถ์๋ ์๋ณ์กฐ ๋ฐฉ์ง๋ฅผ ์ํด ๊ฐ์ธํค๋ฅผ ํตํ ์ ์์๋ช ๋ ์๋ค.
๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ JWT๋ฅผ ์๋ฒ๋ก ์ ์กํ๋ฉด ์๋ฒ๋ ์๋ช ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ฉฐ ๊ฒ์ฆ์ด ์๋ฃ๋๋ฉด ์์ฒญํ ์๋ต์ ๋๋ ค์ค๋ค.
=> Base64 URL-safe Encode๋ ์ผ๋ฐ์ ์ธ Base64 Encode์์ URL์์ ์ค๋ฅ์์ด ์ฌ์ฉํ๋๋ก '+'. '/'๋ฅผ ๊ฐ๊ฐ '-','_'๋ก ํํํ ๊ฒ์ด๋ค.
๐ 1-1. JWT(JSON Web Token)์ ๊ตฌ์กฐ
JWT์ ๊ตฌ์กฐ๋ Header, Payload, Signature๋ก ๊ตฌ์ฑ๋๋ค.
๋ํ, ๊ฐ ์์๋ .์ผ๋ก ๊ตฌ๋ถ๋๋ค.
Header์๋ JWT์์ ์ฌ์ฉํ ํ์ ๊ณผ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ๊ฐ ๋ด๊ฒจ์์ผ๋ฉฐ Payload๋ ์๋ฒ์์ ์ฒจ๋ถํ ์ฌ์ฉ์ ๊ถํ ์ ๋ณด์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ์๋ค.
๋ง์ง๋ง์ผ๋ก Signature ์๋ Header, Payload๋ฅผ Base64 URL-safe Encode๋ฅผ ํ ํ Header์ ๋ช ์๋ ํด์ํจ์๋ฅผ ์ ์ฉํ๊ณ , ๊ฐ์ธํค(Private Key)๋ก ์๋ช ํ ์ ์์๋ช ์ด ๋ด๊ฒจ์๋ค.
์ ์์๋ช ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ ๊ณก์ ์ํธํ(ECDSA)๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ฉด,
์ด๋ฅผ JWT๋ก ํํํ๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๋๋๋ฐ, ์์์ ๋ง๋ ์ ์์๋ช ๋ Base64 URL-safe Encode ๋ก ์ฒ๋ฆฌํด์ ํฉ์ณ์ค ํ์๊ฐ ์๋ค.
์ฌ๊ธฐ์ ๋ง๋ ์ ์์๋ช ์ Header, Payload๊ฐ ๋ณ์กฐ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ค์ ์ ๋ณด์ด๋ฉฐ JWT๋ฅผ ์ ๋ขฐํ ์ ์๋ ํ ํฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ทผ๊ฑฐ๊ฐ ๋๋ค.
๐ 1-2. JWT(JSON Web Token)์ ์ฅ*๋จ์
JWT๋ ์ต๊ทผ ์น์๋น์ค์์ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ ๊ท๊ฒฉ์ด ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ ๋ค์ํ ํด๋ผ์ด์ธํธ(์น,๋ชจ๋ฐ์ผ ๋ฑ)์์ ํธํ์ฑ์ด ๋ฐ์ด๋๋ค.
Payload๊ฐ ๋ง์์ง๋ฉด ํ ํฐ์ด ์ปค์ ธ์ ์๋ฒ์ ๋ถ๋ด์ด ๊ฐ ์ ์๋ค.
ํ ํฐ์ด ์ฌ๋ฐ๊ธ๋๊ธฐ ์ ๊น์ง ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๊ฐฑ์ ๋๋๋ผ๋ ์ ์ฉ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
RESTful๊ณผ ๊ฐ์ ๋ฌด์ํ(Stateless)ํ๊ฒฝ์์์ ํต์ ์ด ์ฉ์ดํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๋ค.
๋ฐ์ดํฐ๋ฅผ ์์ฒด์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ด์ ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ์ํด ํ ์๋น์ค์ ๋ค์ ์์ฒญํ๋ ํ์๊ฐ ์ค์ด๋ค์ด ์๋ฒ์ ๋ถ๋ด์ด ์ค์ด๋ค๊ฒ ๋๋ค.
ํ ํฐ์ ๋ง๋ฃ์๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๋ง๋ฃ์๊ฐ๊น์ง๋ ๊ฐ์ ์ ์ผ๋ก ๋ง๋ฃ์ํฌ ์ ์์ผ๋ฏ๋ก ๋ ธ์ถ์ด ๋์ด์๋ ์ ๋๋ฉฐ ์ค๋ณด์ ๋ณด๋ฅผ ๋ฃ๋ ์ผ์ ์์ด์ผ ํ๋ค.
๐ 2. API์ ์ ์
์ ์ ๋ฐ ํ๋กํ ์ฝ ์งํฉ์ ์ฌ์ฉํ์ฌ ๋ ์ํํธ์จ์ด ๊ตฌ์ฑ ์์๊ฐ ์๋ก ํต์ ํ ์ ์๊ฒ ํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ๊ธฐ์์ฒญ์ ์ํํธ์จ์ด ์์คํ ์๋ ์ผ์ผ ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด ์์ต๋๋ค. ํด๋ํฐ์ ๋ ์จ ์ฑ์ API๋ฅผ ํตํด ์ด ์์คํ ๊ณผ "๋ํ"ํ๊ณ ํด๋ํฐ์ ๋งค์ผ ์ต์ ๋ ์จ ์ ๋ณด๋ฅผ ํ์ํฉ๋๋ค.
API๋ Application Programming Interface(์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋จ ์ธํฐํ์ด์ค)์ ์ค์๋ง์ ๋๋ค. API์ ๋งฅ๋ฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ ๋จ์ด๋ ๊ณ ์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ชจ๋ ์ํํธ์จ์ด๋ฅผ ๋ํ๋ ๋๋ค.
์ธํฐํ์ด์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์๋น์ค ๊ณ์ฝ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ด ๊ณ์ฝ์ ์์ฒญ๊ณผ ์๋ต์ ์ฌ์ฉํ์ฌ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ก ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. API ๋ฌธ์์๋ ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ์์ฒญ๊ณผ ์๋ต์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด ์์ต๋๋ค.
๐ 2-1. API์ ์๋๋ฐฉ์
API ์ํคํ ์ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ธก๋ฉด์์ ์ค๋ช ๋ฉ๋๋ค. ์์ฒญ์ ๋ณด๋ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ผ์ด์ธํธ๋ผ๊ณ ํ๊ณ ์๋ต์ ๋ณด๋ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ๋ผ๊ณ ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ ์จ ์์์ ๊ธฐ์์ฒญ์ ๋ ์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ฒ์ด๊ณ ๋ชจ๋ฐ์ผ ์ฑ์ ํด๋ผ์ด์ธํธ์ ๋๋ค.
API๊ฐ ์์ฑ๋ ์๊ธฐ์ ์ด์ ์ ๋ฐ๋ผ API๋ ๋ค ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์๋ํ ์ ์์ต๋๋ค.
โถ๏ธ SOAP API
โถ๏ธ RPC API
โถ๏ธ Websocket API
JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ ๋ค๋ฅธ ์ต์ ์น API ๊ฐ๋ฐ์ ๋๋ค. WebSocket API๋ ํด๋ผ์ด์ธํธ ์ฑ๊ณผ ์๋ฒ ๊ฐ์ ์๋ฐฉํฅ ํต์ ์ ์ง์ํฉ๋๋ค.
์๋ฒ๊ฐ ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์ ์ฝ๋ฐฑ ๋ฉ์์ง๋ฅผ ์ ์กํ ์ ์์ด REST API๋ณด๋ค ํจ์จ์ ์ ๋๋ค.
โถ๏ธ REST API
REST๋ Representational State Transfer์ ์ค์๋ง์ ๋๋ค. REST๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GET, PUT, DELETE ๋ฑ์ ํจ์ ์งํฉ์ ์ ์ํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ HTTP๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ตํํฉ๋๋ค.
REST API์ ์ฃผ๋ ํน์ง์ ๋ฌด์ํ์
๋๋ค.
๋ฌด์ํ๋ ์๋ฒ๊ฐ ์์ฒญ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์์์ ์๋ฏธํฉ๋๋ค.
์๋ฒ์ ๋ํ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์น ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ์ ์ ๋ ฅํ๋ URL๊ณผ ์ ์ฌํฉ๋๋ค. ์๋ฒ์ ์๋ต์ ์น ํ์ด์ง์ ์ผ๋ฐ์ ์ธ ๊ทธ๋ํฝ ๋ ๋๋ง์ด ์๋ ์ผ๋ฐ ๋ฐ์ดํฐ์ ๋๋ค.
๐ 2-2. ์น API๋?
์น API ๋๋ ์น ์๋น์ค API๋ ์น ์๋ฒ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฒ๋ฆฌ ์ธํฐํ์ด์ค์ ๋๋ค.
๋ชจ๋ ์น ์๋น์ค๋ API์ด์ง๋ง ๋ชจ๋ API๊ฐ ์น ์๋น์ค๋ ์๋๋๋ค. REST API๋ ์์์ ์ค๋ช ํ ํ์ค ์ํคํ ์ฒ ์คํ์ผ์ ์ฌ์ฉํ๋ ํน์ํ ์ ํ์ ์น API์ ๋๋ค.
์ญ์ฌ์ ์ผ๋ก API๊ฐ ์๋ ์์ด๋ ์น ์ ์ ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ Java API, ์๋น์ค API ๋ฑ API์ ๋ํ ๋ค์ํ ์ฉ์ด๊ฐ ์กด์ฌํฉ๋๋ค.
์ต์ ์น API๋ REST API์ด๋ฉฐ ์ฉ์ด๋ ์๋ก ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ 2-3. REST API ์ฌ์ฉ์ ์ด์
ํตํฉ
API๋ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ์กด ์ํํธ์จ์ด ์์คํ
๊ณผ ํตํฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ ๊ธฐ๋ฅ์ ์ฒ์๋ถํฐ ์์ฑํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ์๋๊ฐ ๋นจ๋ผ์ง๋๋ค. API๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ์ฝ๋๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
ํ์
์๋ก์ด ์ฑ์ ๋ฑ์ฅ์ผ๋ก ์ ์ฒด ์ฐ์
์ด ๋ฐ๋ ์ ์์ต๋๋ค. ๊ธฐ์
์ ์ ์ํ๊ฒ ๋์ํ๊ณ ํ์ ์ ์ธ ์๋น์ค์ ์ ์ํ ๋ฐฐํฌ๋ฅผ ์ง์ํด์ผ ํฉ๋๋ค. ์ ์ฒด ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ ํ์ ์์ด API ์์ค์์ ๋ณ๊ฒฝํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค.
ํ์ฅ
API๋ ๊ธฐ์
์ด ๋ค์ํ ํ๋ซํผ์์ ๊ณ ๊ฐ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ ์ ์๋ ๊ณ ์ ํ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ง๋ API๋ฅผ ์ฌ์ฉํ๋ฉด ์น ์ฌ์ดํธ, Android, iOS ๋ฑ์ ํตํด ์ง๋ ์ ๋ณด๋ฅผ ํตํฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ธฐ์
์ด๋ ๋ฌด๋ฃ ๋๋ ์ ๋ฃ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฌํ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ ์ ์์ต๋๋ค.
์ ์ง ๊ด๋ฆฌ์ ์ฉ์ด์ฑ
API๋ ๋ ์์คํ
๊ฐ์ ๊ฒ์ดํธ์จ์ด ์ญํ ์ ํฉ๋๋ค. API๊ฐ ์ํฅ์ ๋ฐ์ง ์๋๋ก ๊ฐ ์์คํ
์ ๋ด๋ถ์ ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ ์์คํ
์ ํฅํ ์ฝ๋ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ์์คํ
์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.