์คํ API ์ธ์ฆ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๊น?
์คํ API ์ธ์ฆ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๊น? ๊ด๋ จ
์ธ๋ถ์ ์ ๊ณตํ๋ REST API๋ฅผ ๊ฐ๋ฐํด์ผ ํ ๋, ์ธ์ฆ์ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ธ๋ถ์ ๊ณ์ฝ์ ๋งบ์ ํน์ ์ ์ฒด์๋ง ์ ๊ณตํด์ผ ํ๋ API์ธ๋ฐ, ์ธ๋ถ์์ ์ ๊ทผํ๋ ๋งํผ ์ธ์ฆ์ด ์ค์ํ์ต๋๋ค. ๋ก๊ทธ์ธ์ด ์๋ ์๋ฒ to ์๋ฒ๋ก ์ ๊ณตํ๋ API๋ ์ด๋ป๊ฒ ์ธ์ฆํ๋ ๊ฑธ๊น? ๊ณ ๋ฏผํ๋ ์ฐจ์ ์คํ API๊ฐ ์๊ฐ์ด ๋ฌ์ต๋๋ค. ์คํ API๋ ์ด์ ๋น์ทํ ์ํฉ์ด์ง ์์๊น ํ๋ ์๊ฐ์ ๋ฐํ์ผ๋ก ์กฐ์ฌํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
์คํ API?
์คํ API๋ ์ธ๋ถ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์๋น์ค์ ์ํธ์์ฉํ ์ ์๋๋ก ๊ณต๊ฐํ API๋ฅผ ๋งํฉ๋๋ค. ํ์ฌ๋ ๋๋ถ๋ถ REST API๋ก ๊ตฌ์ฑํ๋ฉฐ, ์คํ API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ฑฐ๋ ํน์ ์์ ์ ์ํํ ์ ์๋๋ก ์ ๊ณตํฉ๋๋ค.
์๋น์ค๋ฅผ ์ด์ํ๋ ๋ง์ ํ์ฌ์์ ์คํ API๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
ํ๋๋ API ์ด์ฝ๋ ธ๋ฏธ, API-First๋ผ๋ ์ฉ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, ์คํ API๋ฅผ ๋ง์ด ๋ง๋ค๋ ์๊ธฐ๋ ์์๋ค๊ณ ํฉ๋๋ค. ์ด๋ฐ์๋ ์์ ๋ค์ ์๋น์ค๋ฅผ ์๋ฆฌ๊ธฐ ์ข์ ์๋จ์ด๊ธฐ๋ ํ๊ณ ํ์ง๋ง, ์๊ฐ์ด ์ง๋๋ฉด์ ์ธ๋ถ ํธ๋ํฝ์ ์ฆ๊ฐ๋ ๋ฏธ๋ฏธํ๊ณ ์ ์ง๋ณด์์ ๋ํ ๋ฌธ์ ์ ๋ ๋ฐ์ํ๋ฉด์ ์ ๊ณต์ ์ค์ด๋ ์ถ์ธ๋ผ๊ณ ํฉ๋๋ค. ํนํ๋ ํ์ฌ๊ฐ ์ปค์ง์๋ก MSA์ ๊ฐ์ ์ํคํ ์ฒ๋ ๋ด๋ถ์์ ์ฌ๋ฌ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ์คํ API๋ฅผ ๋ด๋ถ์์ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋ค ๋ณด๋ ์ธ๋ถ ์ ๊ณต๋ณด๋ค ๋ด๋ถ์ ์ง์คํ๋ ๊ฒฝํฅ๋ ์๋ค๊ณ ํฉ๋๋ค. (API ์ด์ฝ๋ ธ๋ฏธ์ ๊ดํ ๋ด์ฉ์ ๋งํฌ๋ฅผ ์ฝ์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.)
๊ทธ๋ผ์๋ ์ฌ์ ํ ์๋ง์ ์คํ API๊ฐ ์กด์ฌํ๋ฉฐ, ๋ํ ์๊ฒจ๋๊ณ ์์ต๋๋ค. ChatGPT์ ๊ฐ์ LLM ์๋น์ค๊ฐ ๋์ค๋ฉด์ ์ด๋ฅผ ์ฌ์ฉํ๋ ์คํ API์ ์ฌ์ฉ๋์ ์ค๋ก ์ด๋ง์ด๋งํ ๊ฒ์ ๋๋ค.
์คํ API ์ฌ์ฉ
์ฌ๋ฌ ์๋น์ค์์ ์ ๊ณตํ๋ ์คํ API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋๋ถ๋ถ ๋น์ทํ ์๋๋ฆฌ์ค๋ฅผ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
- ์๋น์ค์ ๋ก๊ทธ์ธ
- ์ ๊ทผํค ๋ฐ๊ธ
- ์คํ API(REST API) ํธ์ถ ์์ ๋ฐ๊ธ๋ฐ์ ์ ๊ทผํค ์ฌ์ฉ
์์ฒ๋ผ ๋ฐ๊ธ๋ฐ์ ํค๋ HTTP API ์์ฒญ ์ ํค๋ ๋๋ ์์ฒญ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ฒ์ ์ ๋ฌํ์ฌ ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ์ ์์ ์ผ๋ก ๋์ ํ๊ฒ ๋ฉ๋๋ค. ์ฌ์ค ์ด๋ ๋ก๊ทธ์ธ ์ธ์ฆ ๊ณผ์ ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
- ํ์๊ฐ์
- ๋ก๊ทธ์ธ ์์ฒญ
- ์๋น์ค REST API ํธ์ถ
์์ ๋ก๊ทธ์ธ ๊ณผ์ ์ ์์ ์ดํด๋ดค๋ ์คํ API์ ์ฌ์ฉ ๊ณผ์ ๊ณผ ๋์นญ์ ์ด๋ฃน๋๋ค.
- ํ์๊ฐ์ -> ์คํ API ์๋น์ค ๋ก๊ทธ์ธ: ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์ธ์ฆ
- ๋ก๊ทธ์ธ ์์ฒญ -> ์ ๊ทผํค ๋ฐ๊ธ: ์๋น์ค๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉํ ์ ์ฅ๊ถ ๋ถ์ฌ
- ์๋น์ค REST API ํธ์ถ: ์ ์ฅ๊ถ์ ์ฌ์ฉํด์ ์๋น์ค ์ฌ์ฉ
์ธ์ฆ(Authentication)
์ ๊ทผ ํค๋ฅผ ์์ฑํ ์ ์๋ ๋ฐฉ์์ ๋ค์ํฉ๋๋ค. API Key, JWT, OAuth 2.0 ๋ฑ์ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
API Key
API Key๋ ์๋ณํ ์ ์๋ ๋จ์ ๋ฌธ์์ด์ ๋๋ค. ์ด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํด์, UUID, ๋์, ๊ท์น์ ๊ฐ๋ ๋ฌธ์์ด ๋ฑ ๋ง๋ค๊ธฐ ๋๋ฆ์ ๋๋ค.
์์
- client1234
- 33cf534f-894e-4047-8b70-69c9f960681d
JWT(JSON Web Token)
JWT ๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์์ ์์ ํ ๋ฐ์ดํฐ ์ ์ก์ ์ํด ์ฌ์ฉํ๋ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์ ๋๋ค. JWT๋ ์๋ช ๋ JSON ํฌ๋งท ํ ํฐ์ผ๋ก, ์ธ์ฆ๊ณผ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
JWT ๊ตฌ์กฐ๋ 3๊ฐ์ ๋ฐ์ดํฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ํค๋(Header)
- ํ์ด๋ก๋(Payload)
- ์๋ช (Signature)
ํค๋๋ ํ ํฐ์ ํ์ ๊ณผ ์๋ช ์ ์ฌ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
{
"alg": "HS256", // ์๋ช
์๊ณ ๋ฆฌ์ฆ, ์ฌ๊ธฐ์๋ HMAC SHA-256
"typ": "JWT"
}
ํ์ด๋ก๋๋ ์ฌ์ฉ์ ์ ๋ณด(ํด๋ ์, Claim)์ ๋ด๊ณ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ ์๋ณ์์ ํ ํฐ ๋ง๋ฃ ์๊ฐ๊ณผ ๊ฐ์ ํ ํฐ์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ํ์์ ๋ง๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
{
"sub": "1234567890", // (Subject): ์ฌ์ฉ์ ID์ ๊ฐ์ ๊ณ ์ ์๋ณ์
"exp": 1717594100, // (Expiration): ํ ํฐ ๋ง๋ฃ ์๊ฐ
"name": "John Doe", // ์ฌ์ฉ์ ์ด๋ฆ
"admin": true, // ์ด๋๋ฏผ ๊ถํ ์ฌ๋ถ
}
์๋ช ์ ํค๋์ ํ์ด๋ก๋๋ฅผ ๋น๋ฐํค๋ก ์๋ช ํ์ฌ ์์ฑํฉ๋๋ค. ์ด ์๋ช ์ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ์๋ฒ์์ ํ ํฐ์ด ๋ณ์กฐ๋์ง ์์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
OAuth 2.0(Open Authorization 2.0)
OAuth๋ ์ฌ์ฉ์๊ฐ ๋น๋ฐ๋ฒํธ(์ ๊ทผ ์ ๋ณด)๋ฅผ ๊ณต์ ํ์ง ์๊ณ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ๊ธฐ ์ํด ์ 3์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฏธ ๋ฑ๋ก๋ ์์ ์ ์ ๋ณด๋ก ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ํ๋ ํ๋กํ ์ฝ์ ๋๋ค.
ํ์ฌ๋ OAuth ๋ผ๊ณ ํ๋ฉด ๋๋ถ๋ถ 2.0 ๋ฒ์ ์ ์ฌ์ฉํ์ฌ OAugh 2.0์ผ๋ก ๋ถ๋ฆฝ๋๋ค. OAuth๋ ์ฃผ๋ก ์นด์นด์คํก ๋ก๊ทธ์ธ, ๊ตฌ๊ธ ๋ก๊ทธ์ธ๊ณผ ๊ฐ์ SNS ๊ฐํธ ๋ก๊ทธ์ธ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ปค ์ผํ ์ฑ์ ๋ง๋ค์๋๋ฐ ์ ๊ทผ์ฑ์ ์ํด์ ํ์๊ฐ์ ์ ๋ฐ๋ก ํ์ง ์๊ณ ์นด์นด์คํก ๋ก๊ทธ์ธ์ผ๋ก๋ ํ์ ๋ฑ๋ก์ด ๋๋๋ก ๊ฐ๋ฐํ๊ณ ์ถ์ต๋๋ค.
๊ตฌํ๋ง๋ค ์์ธ ์ฌํญ์ ๋ฌ๋ผ์ง ์ ์์ง๋ง, ์ผ๋ฐ์ ์ธ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ผ๋ฐ์ ์ธ ๋ก๊ทธ์ธ ํ์ ์ด ๋ฐ์ํ๋ ์ํฉ์ด ์๋ API to API ์ํฉ์์๋ OAuth๋ฅผ ํตํด์ ์ธ์ฆ์ด ๊ฐ๋ฅํ ์ ์์ต๋๋ค. Authorization Server์์ ๋ก๊ทธ์ธ ํ์ ๋์ API๋ก๋ ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅํ๊ฒ ์ ๊ณตํด ์ค๋ค๊ฑฐ๋, ๊ตฌํํ๋ Client์์ ์ถ๊ฐ์ ์ธ ์์ ์ด ๋ ํ์ํ ์ ์์ ๊ฒ์ ๋๋ค. (OAuth 2.0์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ธ๋ก๊ทธ์ ์ ์ ๋ฆฌ๋์ด ์์ผ๋, ๊ถ๊ธํ์ ๋ถ์ ์ฝ์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.)
์ง๊ธ๊น์ง ์ดํด๋ณธ ์ธ์ฆ ๋ฐฉ์์ ํ ๋๋ก ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฅ์
- ์ธ์ฆ ์์ฒญ๊ณผ ํ์ธํ๋ ๊ณผ์ ์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค.
- ์ธ์ฆ ๋ฐฉ์, ๋ฐ์ดํฐ์ ๋ํด์ ์ง์ ๊ด๋ฆฌํ ์ ์๋ค.
๋จ์
- API Key ์์ฒด๊ฐ ๋ ธ์ถ๋๋ฉด ๋๊ตฌ๋ ์ ๊ทผํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์์ฒญ ๋ด์ฉ์ ๋ํ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ์ ํ ์ ์๋ค.
- DB์ ๊ฐ์ ๋ชจ๋ ์๋ฒ๊ฐ ์ ๊ทผํ ์ ์๋ ๊ณต๊ฐ์ด ํ์ํ๋ค.
@tab JWT
์ฅ์
- ์๋ฒ์์ ์ธ์ ์ํ๋ฅผ ์ ์งํ ํ์ ์์ด ํ ํฐ๋ง์ผ๋ก ์ธ์ฆ ๊ฐ๋ฅํ๋ค. (stateless ์ธ์ฆ)
- ์ฌ๋ฌ ์๋ฒ๊ฐ ๋ถ์ฐ๋ ํ๊ฒฝ์์๋ ์ธ์ฆ์ ๊ณต์ ํ ์ ์์ด ํ์ ์ฑ์ ์ ๋ฆฌํ๋ค.
- ํ ํฐ ์์ฒด์ ์๋ช ์ด ๋์ด์์ด์ ๋ณ์กฐ ์ฌ๋ถ๋ฅผ ์๋ฒ์์ ์ ์ ์๋ค. (๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ)
- ํ ํฐ ๋ด์ ํ์ํ ์ ๋ณด(claim)๋ฅผ ๋ด์ ์ ์๋ค.
๋จ์
- ํ ํฐ ํ์ทจ ์ํ, ๋ง๋ฃ๋๊ธฐ ์ ์ ํ ํฐ์ด ํ์ทจ๋๋ ๊ฒฝ์ฐ ์ ์ฉ๋ ์ ์๋ค.
- ํ ํฐ ํฌ๊ธฐ ๋ฌธ์ , JWT ๋ด์ ๋ด๋ ๋ฐ์ดํฐ๊ฐ ์ปค์ง์๋ก ํ ํฐ ํฌ๊ธฐ๋ ์ปค์ง๋ค.
- ํ ํฐ ๊ฐฑ์ ํ์, ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ๊ฐฑ์ ์ ์ฐจ๊ฐ ํ์ํ๋ค.
- ๋ฐ๊ธ๋ ํ ํฐ๊ฐ์ ์์ ์ด๋ ํ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
@tab OAuth 2.0
์ฅ์
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ง์ ๋ ธ์ถํ์ง ์์์ ๋ณด์์ฑ์ด ๋๋ค.
- ํด๋ผ์ด์ธํธ์ ๊ถํ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ด, ๋ณต์กํ ๊ถํ ๊ด๋ฆฌ ์์คํ ์ ์ ํฉํ๋ค.
๋จ์
- ๊ตฌํ์ด ๋ณต์กํ๋ค.
- ํ ํฐ ๊ด๋ฆฌ ํ์ํ๋ค. (JWT ํ ํฐ ๋จ์ ๊ณผ ๋์ผ)
- ์ธ์ฆ ์๋ฒ์ ์์กด์ฑ์ด ์๊ฒจ์ ์ํฅ์ ๋ฐ๊ฒ ๋๋ค.
:::
์คํ API์ ์ธ์ฆ๋ ๋ก๊ทธ์ธ๊ณผ ๊ฐ์ ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์น์ง๋ง, ์ํฉ์ ํ์คํ ๋ค๋ฆ ๋๋ค. ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ํ๋์ ์๋น์ค์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ตฌํ ๋ฐ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํฉ๋๋ค. ํฐ ์๋น์ค๋ผ๊ณ ํด๋ ํ์ด ๋๋์ด์์์ง์ธ์ ๊ฐ์ ํ์ฌ์์ ์ด๋ฃจ์ด์ง๋ ์ธ์ฆ ๋ฐฉ์์ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ์คํ API๋ ์ธ๋ถ์์ ์ธ์ฆ ๋ฐฉ์์ ๊ตฌํํด์ผ ํฉ๋๋ค. ํ์์ ๋ฐ๋ผ์ ๋ณต์กํด์ง ์ ์์ง๋ง, ์ธ๋ถ์์ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ฒผ์ ๋๋ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ด๋ถ๋ณด๋ค๋ ํจ์ฌ ์ด๋ ต์ต๋๋ค. ์ด๋ฌํ ์ ์ ๊ณ ๋ คํ์ ๋, API Key ๋ฐฉ์์ด ์ ํฉํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ธ์ฆ ๋ฐฉ์ ๊ตฌํ์ด ๊ฐ๋จํ๊ณ , ๊ด๋ฆฌ ์ญ์ ์ง์ ๊ฐ๋ฅํฉ๋๋ค.
API Key+
API Key ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๊ฐ๋จํ ๋งํผ ๋ฌธ์ ์ ๋ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก ์์์ ์ธ๊ธํ๋ 3๊ฐ์ง์ ๋จ์ ์ ๋๋ค.
- API Key ์์ฒด๊ฐ ๋ ธ์ถ๋๋ฉด ๋๊ตฌ๋ ์ ๊ทผํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์์ฒญ ๋ด์ฉ์ ๋ํ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ์ ํ ์ ์๋ค.
- DB์ ๊ฐ์ ๋ชจ๋ ์๋ฒ๊ฐ ์ ๊ทผํ ์ ์๋ ๊ณต๊ฐ์ด ํ์ํ๋ค.
์ ๋จ์ ์ ํด๊ฒฐํ๋ ๋ฐ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์กด์ฌํฉ๋๋ค. ํ์ง๋ง ์ด๋ฅผ ์ ์ฉํ๋ ๋งํผ ์ฅ์ ์ด์๋ ๊ฐ๋จํจ์ด ์ ์ ํด์๋ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ํฉ์ ๋ฐ๋ผ ํ์ํ ๋งํผ๋ง ์ ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋จ์ ๋ง๋ค ํ๊ฐ์ง์ฉ ์ ์ฉํด ๋ณผ๋งํ ๋ํ์ ์ธ ๋ฐฉ๋ฒ๋ค์ ์๊ฐํ๊ฒ ์ต๋๋ค.
ํค ๋กํ ์ด์ (๋กค๋ง)
ํค ๋กํ ์ด์ ๋๋ ๋กค๋ง์ ์ธ์ฆ์ ์ฌ์ฉ๋๋ API Key๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณ๊ฒฝํด ์ฃผ๋ ๋ฐฉ๋ฒ์ ๋งํฉ๋๋ค. ์ด๋ฅผ ํตํด์ ํค ์ ์ถ์ ๋ํ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค.
API Key๋ฅผ ์์ฑํ๋ ๋ฐฉ์๋ ์ค์ํฉ๋๋ค. ์์ ํ API Key์ ํน์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ณ ์ ํ ๊ฐ
- ์ถฉ๋ถํ ๊ธธ์ด(32์ ์ด์ ์ถ์ฒ)
- ๋ฌด์์ํ ๋ฌธ์ ์กฐํฉ(๋์๋ฌธ์, ์ซ์, ํน์๋ฌธ์)
- ํค๊ฐ๋ง ๋ณด๊ณ ์ฌ์ฉ์ ๊ตฌ๋ถ, ๋ค์ ํค๊ฐ ๋ฑ์ ์ ์ถ ๋ถ๊ฐ๋ฅ
์์ ํ ํค ์์ฑ ๋ฐฉ์ ๋ช ๊ฐ์ง๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
1. UUID(Universally Unique Identifier)
UUID๋ ์ ์ธ๊ณ์ ์ผ๋ก ์ ์ผํ ์๋ณ์๋ฅผ ์์ฑํ๋ ํ์ค ๋ฐฉ์์ ๋๋ค.
// UUID ์์ฑ
String uuid = UUID.randomUUID().toString();
System.out.println("Generated UUID: " + uuid);
// ์์ฑ ํค: 33cf534f-894e-4047-8b70-69c9f960681d
2. SecureRandom
(์ํธํ ๋์ ์์ฑ)
SecureRandom secureRandom = new SecureRandom(); // ์ํธํ ๋์ ์์ฑ
byte[] keyBytes = new byte[32]; // 256๋นํธ(32๋ฐ์ดํธ) ํค ์์ฑ
secureRandom.nextBytes(keyBytes);
String key = Base64.getUrlEncoder().withoutPadding().encodeToString(keyBytes);
System.out.println("Generated SecureRandom Key: " + key);
// ์์ฑ ํค: gdCqlByiucDVFlt0BN0dN28mDIT9bogaqW5-pMfL5W0
3. SHA256 ํด์
// ์
๋ ฅ๊ฐ(๊ณ ์ ์๋ณ์ + ๋น๋ฐ ํค) ๊ฒฐํฉ ํ์
String input = "unique_user_identifier" + "your_secret_key";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
String key = Base64.getUrlEncoder().withoutPadding().encodeToString(hash);
System.out.println("Generated SHA-256 Hash: " + key);
// ์์ฑ ํค: r396NURYomPq8UYAJ1AT-x4bk4dVwdhA3hphPWLXcNk
4. UUID + SHA 256 ํด์ ์กฐํฉ
// UUID ์์ฑ
String uuid = UUID.randomUUID().toString();
// SHA-256 ํด์ ์์ฑ
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(uuid.getBytes(StandardCharsets.UTF_8));
// Base64๋ก ์ธ์ฝ๋ฉ (URL-safe ํฌ๋งท)
String key = Base64.getUrlEncoder().withoutPadding().encodeToString(hash);
System.out.println("Generated UUID and SHA-256 Hash: " + key);
// ์์ฑ ํค: WMf8eEMAgSTZHVqLFZjwzPXNE0RPwV9x1ms84AxnTfs
์ด์ ๊ฐ์ด ์์ธก ๋ถ๊ฐ๋ฅํ ํค๊ฐ์ ๋ฐํ์ผ๋ก ๋กํ ์ด์ ์ ๋๋ ค์ผ ๋์ฑ ์์ ํ ํค ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ํค ๋กํ ์ด์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์งํ๋ฉ๋๋ค.
- Key ๋กํ ์ด์ ์ค์ผ์ค ์ค์
- ์ Key ์์ฑ ๋ฐ ์ ์ฅ
- ์ Key ์ ๋ฌ
- ํค ๊ต์ฒด ์๋ฆผ ๋ฐ์ก
- ์ ์ ๊ธฐ๊ฐ ๋์ ๋ Key ๋์ ํ์ฉ
- ์ ์ ๊ธฐ๊ฐ ์ข ๋ฃ ํ ์ด์ Key ํ๊ธฐ
์ ๊ณผ์ ์ ์๋ํํ๋ ๊ฒ์ด ๊ด๋ฆฌํ๊ธฐ ๋์ฑ ์ฌ์์ง ๊ฒ์ ๋๋ค. ํค ๊ฐฑ์ API๋ฅผ ์ ๊ณตํ์ฌ ๋กํ ์ด์ ์ ์๋์ผ๋ก ํด์ค ์๋ ์์ ๊ฒ์ ๋๋ค. ๋ํ, ๋ชจ๋ํฐ๋ง์ ํตํด ํค๊ฐ ์ ์์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋์ง, ๋กํ ์ด์ ์ด ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ก๋์ง ๋ฑ์ ๋น ๋ฅด๊ฒ ํ์ ํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค.
HMAC(Hash-based Message Authentication Code)
HMAC์ ์ผ๋ฐ์ ์ผ๋ก ํด์ ํจ์(์:SHA-256, SHA-1) ๊ธฐ๋ฐ์ผ๋ก, ๋น๋ฐ ํค์ ๋ฉ์์ง๋ฅผ ์ํธํํ์ฌ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด ๋ฉ์์ง ๋ฌด๊ฒฐ์ฑ๊ณผ ์ธ์ฆ์ ๋ณด์ฅํ๋ ๋ฐฉ์์ ๋๋ค.
HMAC ์ธ์ฆ์ ๋ ๊ฐ์ง ์ ๋ ฅ์ด ํ์ํฉ๋๋ค.
- ๋ฉ์์ง: ์ธ์ฆํ๋ ค๋ ๋ฐ์ดํฐ (์: API ์์ฒญ ๋ณธ๋ฌธ ๋๋ ํ๋ผ๋ฏธํฐ)
- ๋น๋ฐ ํค(Secert Key)
๋น๋ฐํค๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ณต์ ํ๋ ๋น๋ฐํค๋ก, ๋ฉ์์ง๋ฅผ ํด์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋น๋ฐ ํค๋ฅผ ์๊ณ ์๋ ์ฌ๋๋ง์ด HMAC์ ๊ณ์ฐํ ์ ์์ผ๋ฏ๋ก, ์ธ์ฆ์ ์ญํ ๋ ์ํํ ์ ์์ต๋๋ค.
๋ง์ฝ HMAC ๋ฐฉ์์ ์ฌ์ฉํ๋ค๊ณ ํ๋ฉด, API Key๋ฅผ ์ด ๋น๋ฐํค๋ก ๋์ฒดํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ณด์์ ์ํด ์ข ๋ ๊น๋ค๋กญ๊ฒ ํด์ฃผ๋ ค๋ฉด ๋ ๋ค ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ์ ์์ต๋๋ค.
์๋ฒ โ ํด๋ผ์ด์ธํธ HMAC ์ธ์ฆ ๋ฐ ์ ์ก ๊ณผ์
- ์๋ฒ์์ ๋ฐ๊ธํ ๋น๋ฐ ํค๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๊ณต์ ํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๋น๋ฐ ํค์ ๋ฉ์์ง๋ฅผ HMAC ํด์ ํจ์๋ฅผ ํตํด ์๋ช ํฉ๋๋ค.
- ํด๋ผ์ธ์ดํธ๋ ๋ฉ์์ง์ ์๋ช ์ ์๋ฒ์๊ฒ ์ ์กํฉ๋๋ค.
- ์๋ฒ๋ ์์ ์ด ๊ฐ๊ณ ์๋ ๋น๋ฐ ํค์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ฐ์ ๋ฉ์์ง๋ฅผ HMAC ํด์ ํจ์๋ฅผ ํตํด ์๋ช ํฉ๋๋ค.
- ์๋ฒ๋ 4๋ฒ ๊ณผ์ ์์ ์์ฑํ ์๋ช ๊ณผ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ฐ์ ์๋ช ์ ๋น๊ตํฉ๋๋ค.
- ๋น๊ต ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํฉ๋๋ค.
๋ง์ฝ ๊ณต๊ฒฉ์๊ฐ ๋ฉ์์ง์ ์๋ช ์ ๊ฐ๋ก์ฑ ๋ค, ๋ฉ์์ง๋ง ์์ ์ด ์ํ๋ ๋ฉ์์ง๋ก ๋ณ๊ฒฝํ์ฌ ์๋ฒ์๊ฒ ์์ฒญํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ๊ทธ๋ฌ๋ฉด ์๋ฒ์์๋ ๋ณ์กฐ๋ ๋ฉ์์ง์ ๋น๋ฐํค๋ก ์๋ช ์ ๋ง๋๋๋ฐ, ์ด๋ ๋ง๋ค์ด์ง ์๋ช ์ ์๋ณธ ๋ฉ์์ง์ ๋ค๋ฅด๋ฏ๋ก ์์ฒญํ ์๋ช ๊ณผ๋ ์ ํ ๋ค๋ฅธ ์๋ช ๊ฐ์ด ๋ง๋ค์ด์ง ๊ฒ์ ๋๋ค.
HMAC ์ธ์ฆ์ ์ด๋ฅผ ํตํด ๋ฉ์์ง์ ๋ฌด๊ฒฐ์ฑ์ ์ง์ผ์ค๋๋ค. ์ฌ๊ธฐ์ ์ข ๋ ์์ ์ฑ์ ์งํค๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ํ์์คํฌํ๋ Nonce(Number used once, ํ ๋ฒ๋ง ์ฌ์ฉ๋๋ ๊ฐ) ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ํด์ ์ธ์ฝ๋ฉ์ ๋ฉ์์ง์ ํจ๊ป ์ด๋ฌํ ๊ฐ์ ํฌํจํด์ ๋ณด๋ด๊ฒ ๋๋ฉด, ๊ฐ์ ๋ฉ์์ง๋ผ๋ ๋ค๋ฅธ ์๋ช ์ด ๋ง๋ค์ด์ง๋๋ค. ๋ฐ๋ผ์ ์๋ช ๋ง ๋ณด๊ณ ๋ ๋์ฑ ์ด๋ค ๊ฐ์ธ์ง๋ ๋์ฑ ์์ธกํ๊ธฐ ์ด๋ ค์์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋ง์์ค ์ ์์ต๋๋ค.
์ด์ ๋ํด ํ์์คํฌํ๋ฅผ ํ์ฉํ๋ฉด ํน์ ์๊ฐ์๋ง ๋ณด๋ธ ๋ฉ์์ง๋ง ํ์ฉํ๋ค๋ ๊ท์น์ ๋ ์ถ๊ฐํด ์ค ์๋ ์์ต๋๋ค. ๊ฐ๋ น 5๋ถ ์ด๋ด์ ์์ฒญ๋ง ์ ํจํ๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ด๋ผ๋ ๊ท์น์ ๋ง๋ค ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก HMAC์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํด๋ผ์ด์ธํธ ์ญ์ ๊ตฌํ์ด ํ์ํฉ๋๋ค. HMAC์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ธ์ฆ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์๋ฐ ๊ธฐ์ค์ผ๋ก ๊ธฐ๋ณธ ํจํค์ง์ ํฌํจ๋์ด ์์ด ํธ๋ฆฌํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
public class HMACTest {
private static final String SECRET_KEY = "supersecretkey"; // ์๋ฒ์์ ๊ด๋ฆฌํ๋ ๋น๋ฐ ํค
@Test
void generate_and_verify() {
try {
// generateHMAC ๋ฉ์๋๋ฅผ ์ฌ์ฉํด HMAC ์๋ช
์์ฑ
String message = "This is the API request data";
String hmacSignature = generateHMAC(message, SECRET_KEY);
System.out.println("Generated HMAC Signature: " + hmacSignature);
// verifyHMAC ๋ฉ์๋๋ฅผ ์ฌ์ฉํด HMAC ์๋ช
๊ฒ์ฆ
Assertions.assertThat(verifyHMAC(message, hmacSignature)).isTrue();
} catch (Exception e) {
System.out.println("Error occurred while generating or verifying HMAC signature: " + e.getMessage());
}
}
// HMAC ์๋ช
์์ฑ ํจ์
private String generateHMAC(String data, String secretKey) throws Exception {
// HMAC ์๊ณ ๋ฆฌ์ฆ ์ง์ (SHA-256)
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
// SecretKeySpec์ ์ฌ์ฉํด ๋น๋ฐ ํค ์ค์
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
sha256_HMAC.init(secretKeySpec);
// ์
๋ ฅ ๋ฐ์ดํฐ์ ๋ํด HMAC ์๋ช
์์ฑ
byte[] hmacBytes = sha256_HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8));
// Base64๋ก ์ธ์ฝ๋ฉํ์ฌ ๋ฐํ
return Base64.getEncoder().encodeToString(hmacBytes);
}
// HMAC ๊ฒ์ฆ ๋ฉ์๋
private boolean verifyHMAC(String data, String receivedHMAC) throws Exception {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
sha256_HMAC.init(secretKeySpec);
byte[] hmacBytes = sha256_HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8));
String calculatedHMAC = Base64.getEncoder().encodeToString(hmacBytes);
return calculatedHMAC.equals(receivedHMAC); // ๋ฐ์ HMAC๊ณผ ๊ณ์ฐ๋ HMAC ๋น๊ต
}
}
์บ์
API Key ๋ฐฉ์์ ๋จ์ ์ค ํ๋๋ DB์ ๊ฐ์ ์ ๊ทผํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฒ์ ๋๋ค. ์ด ๋น์ฉ์ ์ค์ฌ์ค ์ ์๋ ๋ํ์ ์ธ ๋ฐฉ์์ด ์บ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. Redis์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์บ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํค๋ฅผ ํ์ธํ๋๋ฐ ์๊ฐ์ด ํจ์ฌ ์ค์ด๋ค ๊ฒ์ ๋๋ค. (๋ฌผ๋ก ํค์ ๋ณํ๋ฅผ ์บ์์ ๊ณ์ ๋ฐ์ํด ์ฃผ์ด์ผํ๋ฏ๋ก ๊ด๋ฆฌ ๋น์ฉ์ด ์ฆ๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฌด์กฐ๊ฑด ์บ์๋ฅผ ํ์ฉํ๊ธฐ๋ณด๋ค๋ ์ํฉ์ ๋ง๊ฒ ์ ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.)
API ๋ณด์
์ธ์ฆ ๋ฐฉ์ ํ๋๋ก๋ ๋น์ฐํ ๋ณด์์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ณด์์ ๋ฐฑ๋ฒ, ์ฒ ๋ฒ์ ๊ฐ์กฐํด๋ ๊ณผํจ์ด ์์ต๋๋ค. ์ธ์ฆ ๋ฐฉ์์ ์ ์ธํ๊ณ ์ถ๊ฐํ ์ ์๋ ๋ณด์๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
HTTPS ์ฌ์ฉ
๋ณด์์ ์ผ๋ก ์ค์ํ ์์ฒญ์ ๋ฐ๋์ HTTPS๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. HTTPS ์์ฒญ์ ์์ฒญํ HTTP ํ๋กํ ์ฝ ๋ด์ฉ์ ์ํธํํ์ฌ, ๊ณต๊ฒฉ์์๊ฒ ํ์ทจ๋นํ๋๋ผ๋ ๋ด์ฉ์ ๋ณผ ์ ์๊ฒ ๋ง์์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
์ฌ์ค API Key๋ ๋น๋ฐํค ๋ฐ๊ธ ๊ฒฝ์ฐ์๋ REST API๋ฅผ ์ฌ์ฉํด์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ์ด๋ฐ ๊ฒฝ์ฐ๋ ๋ฐ๋์ HTTPS๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ํด๋ผ์ด์ธํธ์์ HTTP๋ก ์์ฒญ๋ณด๋ผ ์, HTTPS๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ค์ ์ ํด์ค ์ ์์ต๋๋ค. ์ด๋ NGINX์ ๊ฐ์ ์น์๋ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ ํด ์ค ์ ์์ต๋๋ค.
์๋ฒ์์ HTTPS๋ก ๋ฆฌ๋ค์ด๋ ์ ํ, HSTS(HTTP Strict Transport Security) ํค๋๋ฅผ ์ค์ ํด ์ฃผ๋ฉด ์ค์ ํ ์๊ฐ ๋์์ ๋ธ๋ผ์ฐ์ ์์ HTTPS๋ก ํธ์ถ์ ๊ฐ์ ํ ์๋ ์์ต๋๋ค.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age=31536000
: ๋ธ๋ผ์ฐ์ ๊ฐ ์์ผ๋ก 1๋ ๊ฐ(31,536,000์ด) ์ด ์ฌ์ดํธ๋ฅผ HTTPS๋ก๋ง ์ ์ํ๋๋ก ํฉ๋๋ค.includeSubDomains
: ํ์ ๋๋ฉ์ธ๋ HTTPS๋ก๋ง ์ ์ํ๋๋ก ์ง์ํฉ๋๋ค.preload
: ๋ธ๋ผ์ฐ์ ์ HSTS ํ๋ฆฌ๋ก๋ ๋ฆฌ์คํธ์ ์ถ๊ฐํด๋ฌ๋ผ๋ ์์ฒญ์ผ๋ก, ์ด๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ ๋ฏธ๋ฆฌ HTTPS๋ก ๊ฐ์ ํธ์ถํ๋ผ๋ ์ ๋ณด๋ฅผ ๋ด์ฅํ ์ ์์ต๋๋ค.
IP ํ์ดํธ ๋ฆฌ์คํธ(White List)
IP ํ์ดํธ ๋ฆฌ์คํธ๋ ํ์ฉํ IP๋ง ์๋ฒ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ค์ ํ๋ ๊ฒ์ ๋๋ค. ์ด ์ค์ ์ NGINX์ ๊ฐ์ ์น์๋ฒ, ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋, ํด๋ผ์ฐ๋ ์๋น์ค ๋ฑ์์ ์ค์ ํ ์ ์์ต๋๋ค. IP ๋ฆฌ์คํธ๋ฅผ ์ค์ ํ ๋, ์ฃผ์ํ ์ ์ ์์ฒญ์ด ํ๋ก์ ์๋ฒ๋ ๋ก๋๋ฒจ๋ฐ์๋ฅผ ๊ฑฐ์ณ ๊ฐ ๊ฒฝ์ฐ IP๊ฐ ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ ๋๋ค.
์๋ณธ ์์ค IP(๋คํธ์ํฌ ๊ณ์ธต)๋ Remote Address๋ผ๋ ๊ณณ์ ์ ์ฅ๋ฉ๋๋ค. ๋ง์ฝ ํ๋ก์ ์๋ฒ๋ ๋ก๋๋ฒจ๋ฐ์๋ฅผ ๊ฑฐ์น๋ค๋ฉด HTTP ์์ฒญ ํค๋๋ฅผ ์ดํด๋ด์ผ ํฉ๋๋ค.
X-Forwarded-For
ํค๋X-Real-IP
ํค๋
์ผ๋ฐ์ ์ผ๋ก ํ๋ก์ ์๋ฒ๋ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ์ ์ค์ IP๋ X-Forwarded-For
ํค๋์ ํฌํจ๋ฉ๋๋ค. ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ ์๋ฒ๋ฅผ ๊ฑฐ์น ๊ฒฝ์ฐ X-Forwarded-For
ํค๋์๋ ํด๋ผ์ด์ธํธ์ ์ค์ IP์ ๊ฐ ํ๋ก์ ์๋ฒ์ IP๊ฐ ์์๋๋ก ์ถ๊ฐ๋ฉ๋๋ค.
- ์์:
X-Forwarded-For: ํด๋ผ์ด์ธํธIP, ์ค๊ฐํ๋ก์IP, ์ต์ข ํ๋ก์IP
- ํด๋ผ์ด์ธํธ์ ์ค์ IP๋ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ IP๋ก ํด์๋ฉ๋๋ค.
์ผ๋ถ ์๋ฒ๋ ํ๋ก์ ํ๊ฒฝ์์๋ X-Real-IP
ํค๋์ ํด๋ผ์ด์ธํธ์ ์ค์ IP๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Nginx๋ ๊ธฐ๋ณธ ์ค์ ์์ X-Real-IP
ํค๋๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ IP๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. ๋๋ถ๋ถ ์ค์ ์์๋ ์ ํค๋์ ์ค์ ๋ ๊ฐ๋ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์๋ฐฉํฅ ์ธ์ฆ(Mutual SSL ๋๋ Mutual TLS)
์๋ฐฉํฅ ์ธ์ฆ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์๋ฐฉํฅ ์ธ์ฆ์ ์ํํ์ฌ ์์ชฝ์ด ์๋ก์ ์ ์์ ํ์ธํ๊ณ ๋ณด์์ ๊ฐํํ๋ SSL/TLS ์ธ์ฆ ๋ฐฉ์์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก HTTPS๋ฅผ ์ฌ์ฉํ ๋๋ ์๋ฒ๋ง ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์ฆ์๋ฅผ ์ ์ํด ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ฅผ ์ ๋ขฐํ ์ ์๋๋ก ํ๋ ๋ฐ๋ฉด, Mutual SSL์์๋ ํด๋ผ์ด์ธํธ๋ ์์ ์ ์ธ์ฆ์๋ฅผ ์๋ฒ์ ์ ์ํ์ฌ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์ ๋ขฐํ ์ ์๋๋ก ํฉ๋๋ค.
์๋ฐฉํฅ ์ธ์ฆ์ ๊ธ์ต ์๋น์ค, ์ ๋ถ ๊ธฐ๊ด, ๊ธฐ์ ๋คํธ์ํฌ ๋ฑ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ๋ ๋์ ๋ณด์์ด ํ์ํ ์ํฉ์์ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ญ์ ๋น๋ฐ๋ฒํธ๋ ํค๊ฐ ์๋ ์ธ์ฆ์๋ก ์ธ์ฆ์ ์งํํ๋ฏ๋ก ์ ์ถ์ ๋ํ ์ํ์ด ์ ์ต๋๋ค.
๋จ, ์๋ฐฉํฅ์ผ๋ก ์ธ์ฆํ๋ ๋งํผ ์ค์ ๊ณผ ๊ตฌํ์ด ๋ณต์กํ๊ณ ์ธ์ฆ์์ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ๋ํ, ํด๋ผ์ด์ธํธ์ SSL/TLS ํธ๋์ ฐ์ดํฌ ๊ณผ์ ์ด ์ถ๊ฐ๋๋ ๋ฑ์ ์ฑ๋ฅ์ ์ผ๋ก๋ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ ๋ฆฌ
์ง๊ธ๊น์ง ์คํ API๋ ์ธ์ฆ์ ์ด๋ป๊ฒ ํ ๊น?๋ผ๋ ์๋ฌธ์์ ์์ํ์ฌ, ๊ฐ์ธ์ ์ผ๋ก๋ API key ๋ฐฉ์์ด ์ ํฉํ๋ค๊ณ ํ๋จํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ API Key ๋ฐฉ์์ ๋จ์ ์ ๋ณด์ํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ณด์์ ๋ ๋์ผ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ๊ฐ์ด ์ดํด๋ณด์์ต๋๋ค. ์์ฆ์ ๋๋ถ๋ถ HTTPS๋ฅผ ๋น์ฐํ ์ฐ๊ณ ์๋ ํ๊ฒฝ์ ์์ต๋๋ค. ์ด๋ HTTP ํจํท์ด ๋ ธ์ถ๋๋๋ผ๋ ๋ด๋ถ ๋ฐ์ดํฐ์ ์ ์ถ๊น์ง ์ด์ด์ง๊ธฐ์๋ ์ด๋ ต๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ํฉ์์ ๋ณด์์ด ๋งค์ฐ ์ค์ํ ์ํฉ์ด ์๋๋ผ๋ฉด API Key ๋ฐฉ์์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์๊น ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ณด์์ด ์ค์ํ๋ค๋ ๊ฒ์ ์คํ API๋ก ์ ๊ณต๋๋ ๊ธฐ๋ฅ์ผ๋ก ๋ด๋ถ์ ์์คํ ์ด ๋ง๊ฐ์ง ์ ์๋๋๋ฅผ ์๊ฐํด ๋ณด์์ผ ํ ๊ฒ์ ๋๋ค. ์ฌ์ค ์๋ฆผ ๋๋ ์ด๋ฉ์ผ ์ ์ก, ๊ฐ์ธ ๋ฆฌ์์ค ํ ๋น๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ์ ์ถ๋์ด ์ ์ฉ๋๋ฉด, ๋ด๋ถ ์์คํ ์ด ์๋ API Key๋ฅผ ๊ฐ๊ณ ์๋ ํด๋ผ์ด์ธํธ์๊ฒ ํผํด๊ฐ ํฝ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ API Key๋ฅผ ๋ ธ์ถ์ํค์ง ์๊ธฐ ์ํด ๋ ธ๋ ฅ์ ๋ง์ด ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ง์ ์คํ API ๊ธฐ๋ฅ์ ์ฌ๊ธฐ์ ์ํฉ๋๋ค.
๋ด๋ถ ์์คํ ์ ์ถฉ๋ถํ ์ด์ง๋ฝํ๊ฑฐ๋ ๋ง๊ฐ๋จ๋ฆด ์ ์๋ ์คํ API ๊ธฐ๋ฅ์ ๋น์ฐํ ์ฌ๊ธฐ์ ๋ณด์์ ๋์ฑ ๋์ฌ์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด์ ์์ ์ดํด๋ณธ ํค ๋กํ ์ด์ , HMAC, IP ํ์ดํธ ๋ฆฌ์คํธ, Mutual SSL ๋ฑ์ ํ์์ ๋ง๊ฒ ์ ์ฉํด์ผ ํ ๊ฒ์ ๋๋ค.
์ฐธ๊ณ ์๋ฃ
- https://lesstif.com/ws/rest-api-hmac-87949394.html
- ChatGPT โ Code Copilot
์๋ฌธ