๐ง Ghost Admin API์์ JWT ์ธ์ฆ ์ค๋ฅ ํด๊ฒฐ๊ธฐ
Ghost ๋ธ๋ก๊ทธ์์ Admin API๋ฅผ ํธ์ถํ๋ ค๋ฉด JWT๋ฅผ ๋ฐ๊ธํด์ผ ํฉ๋๋ค.
๋ฌธ์๋ ๋ง๊ณ ์์ ๋ ์์ด์ ๊ฐ๋จํด ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ์์ ์ฐจ์ด ํ๋๋ก ๊ณ์ ์ธ์ฆ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์ datetime.utcnow()๋ก JWT๋ฅผ ๋ฐ๊ธํ์ ๋ ๋ฐ์ํ 401 Invalid JWT ๋ฌธ์ ์ ์์ธ์ ๋ถ์ํ๊ณ ,
"์ datetime.now()๋ก๋ ๋๋๋ฐ, utcnow()๋ก ํ๋ฉด ์คํจํ ๊น?"๋ผ๋ ์ง๋ฌธ์ ๋ํ ๋ชจ๋ ํด๋ต์ ๋ด์์ต๋๋ค.
โณ JWT ๊ธฐ๋ณธ ๊ตฌ์กฐ
JWT๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๋ ๊ฐ์ง ์๊ฐ ๊ด๋ จ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค:
| ํ๋ | ์ค๋ช |
|---|---|
iat |
ํ ํฐ ๋ฐ๊ธ ์๊ฐ (issued at) |
exp |
ํ ํฐ ๋ง๋ฃ ์๊ฐ (expiration) |
{
"iat": 1712900400,
"exp": 1712900700
}
๐ Ghost๋ ์ด๋ป๊ฒ JWT๋ฅผ ๊ฒ์ฆํ ๊น?
Ghost๋ jsonwebtoken์ด๋ผ๋ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด JWT๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
Ghost์ ํต์ฌ ์ฝ๋ (core/server/services/auth/api-key/admin.js)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
const verified = jwt.verify(token, secret, {
audience: '/admin/',
algorithms: ['HS256'],
ignoreExpiration: false
});
ignoreExpiration: false๋ ๋ง๋ฃ์๊ฐ(exp)์ ๋ฐ๋์ ๊ฒ์ฌํ๊ฒ ๋ค๋ ์๋ฏธ์ ๋๋ค.
โ ์คํ ๊ฒฐ๊ณผ: now()๋ ๋๊ณ , utcnow()๋ ์คํจ?
์คํ 1 - datetime.now() ์ฌ์ฉ (KST ๊ธฐ์ค)
- ์์ฑ๋
iat: ํ์ฌ ์๊ฐ๋ณด๋ค ๋ฏธ๋๋ก ์ธ์ - โ ์ ์ ์ธ์ฆ๋จ
์คํ 2 - datetime.utcnow() + 10์ด ์ฌ์ฉ
- ์์ฑ๋
iat: Ghost ์๋ฒ๋ณด๋ค ๊ณผ๊ฑฐ ์์ ์ผ๋ก ์ธ์ - โ
401 INVALID_JWT์ค๋ฅ ๋ฐ์
๐งญ ์์ธ์ ์๋ฒ ์๊ฐ๊ณผ์ ์ค์ฐจ
์ปจํ ์ด๋ ๋ด๋ถ์์ ํ์ธํ ์๋ฒ ์๊ฐ:
$ docker exec -it ghost date
Sat Apr 12 15:14:10 UTC 2025
์ฆ, JWT ๋ฐ๊ธ ์์ ์ด ์๋ฒ ์๊ฐ๋ณด๋ค ์์ ์์ด์ผ ํ ํฐ์ด ์ ํจํฉ๋๋ค.
utcnow()๋ ์ค์ ์๋ฒ๋ณด๋ค ๋ช ์ด ๊ณผ๊ฑฐ๋ก ์ฐํ๋ ๋ฌธ์ ๊ฐ ์์๋ ๊ฒ์ด์ฃ .
โ ์ ๋ฆฌ
| ํญ๋ชฉ | ์ค๋ช | ๊ถ์ฅ |
|---|---|---|
iat |
ํ ํฐ ์์ฑ ์๊ฐ | ์๋ฒ ์๊ฐ๋ณด๋ค ๋ฏธ๋๋ก ์ค์ โ |
exp |
๋ง๋ฃ ์๊ฐ | ๋ฐ๋์ ์ฒดํฌ๋จ โ |
datetime.utcnow() |
์์คํ ์๊ฐ ์ค์ฐจ์ ๋ฏผ๊ฐ | ๋ฒํผ ์ถ๊ฐ ํ์ |
datetime.now() |
KST ๊ธฐ์ค์ด๋ผ ์๋ฒ๋ณด๋ค ๊ณผ๊ฑฐ๋ก ์ธ์๋ ์ ์์ | โ ํต๊ณผ๋ ํ๋ฅ ๋์ |
ignoreExpiration |
false์ด๋ฉด exp๋ ๊ผญ ๊ฒ์ฌํจ |
โ์ฃผ์ |
๐ก ์ค์ ํ
- ๊ฐ๋ฅํ
datetime.utcnow()+ 5~10์ด ๋ฒํผ ์ถ๊ฐ - ์๋ฒ๋ ๋ฐ๋์ NTP ๋๊ธฐํ
- ํ ํฐ ์ ํจ ์๊ฐ์ 5~10๋ถ ์ด๋ด ์ ์ง
๐ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ด๋ฒ ๋ฌธ์ ๋ ๋จ์ํ ์ฝ๋๋ฅผ ๊ณ ์น๋ ๊ฒ ์๋๋ผ,
์๊ฐ ๋๊ธฐํ์ JWT ํ์ค ์ดํด๊ฐ ํจ๊ป ํ์ํ ์ด์์์ต๋๋ค.
์ด ๊ธ์ Joon์ ์คํ๊ณผ ChatGPT์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
๐ท ํ๊ทธ
tech, ghost, jwt, debug