JWT secret ํค ๊ธธ์ด ๋ถ์กฑ์ผ๋ก ์ธํ WeakKeyException ํด๊ฒฐ
๋ชฉ์ฐจ
1. ๊ตฌํ ๋ฐฐ๊ฒฝ
JWT ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
์ ๊ตฌํํ๋ค. JwtProvider์ @PostConstruct๋ก init() ๋ฉ์๋๋ฅผ ์์ฑํด ์ ํ๋ฆฌ์ผ์ด์
์์ ์ secret ํค๋ฅผ ์ด๊ธฐํํ๋๋ก ํ๊ณ , application.yml์ jwt.secret ๊ฐ์ ์ค์ ํ๋ค.

2. ๋ฌธ์ ์ํฉ
์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ์๋ง์ ์๋ฒ๊ฐ ์์๋์ง ์์๊ณ , jwtProvider ๋น ์์ฑ ๊ณผ์ ์์ ์ด๊ธฐํ ๋ฉ์๋ ์คํ์ ์คํจํ๋ค.
Error creating bean with name 'jwtProvider': Invocation of init method failed
์คํ ํธ๋ ์ด์ค๋ฅผ ๋ฐ๋ผ๊ฐ๋ณด๋ ๊ทผ๋ณธ ์์ธ์ WeakKeyException์ด์๋ค. ์ง์ ํ secret ํค์ ๊ธธ์ด๊ฐ JWT HMAC-SHA ์๊ณ ๋ฆฌ์ฆ์์ ์๊ตฌํ๋ ๋ณด์ ๊ธฐ์ค์ ์ถฉ์กฑํ์ง ๋ชปํ๋ค.
io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 152 bits
which is not secure enough for any JWT HMAC-SHA algorithm.
3. ์์ธ
์์ธ์ application.yml์ ์ค์ ํ jwt.secret ๊ธฐ๋ณธ๊ฐ์ด ๋๋ฌด ์งง์๊ธฐ ๋๋ฌธ์ด๋ค.
app.jwt.secret=${JWT_SECRET:change-me-for-local}
๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ change-me-for-local์ ๊ธธ์ด๊ฐ ์งง์ HMAC-SHA256 ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์๊ตฌ ํค ๊ธธ์ด์ธ 256๋นํธ(32๋ฐ์ดํธ)๋ฅผ ๋ง์กฑํ์ง ๋ชปํ๋ค.
WeakKeyException์ ๋ฐ์์์ผ ์ ํ๋ฆฌ์ผ์ด์
์์์ ๋ง๋๋ค.4. ํด๊ฒฐ
ํด๊ฒฐ ๋ฐฉ๋ฒ์ jwt.secret ๊ฐ์ 32์ ์ด์์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค. ๋ก์ปฌ ํ๊ฒฝ์์๋ ์ถฉ๋ถํ ๊ธธ์ด์ ์์ secret ๊ฐ์ ์ค์ ํด ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ๊ธฐ๋๋๋๋ก ํ๋ค.
jwt:
secret: booktine-secret-key-for-jwt-signing-must-be-32bytes-or-longer
secret ํค ๊ธธ์ด๋ฅผ ์ถฉ๋ถํ ๋๋ฆฐ ๋ค ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ๊ธฐ๋๋์๊ณ , JwtProvider ์ด๊ธฐํ๋ ์ฑ๊ณตํ๋ค.
์ด์ ํ๊ฒฝ์์ ์ฌ์ฉํ secret ํค๋ ์ง์ ์์ฑํ๊ธฐ๋ณด๋ค, ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ก ์ถฉ๋ถํ ๊ธด ๋๋ค ๊ฐ์ ์์ฑํ๋ ๊ฒ์ด ์์ ํ๋ค.
openssl rand -base64 64
์์ฑํ ๊ฐ์ ์ฝ๋๋ ์ค์ ํ์ผ์ ์ง์ ์์ฑํ์ง ์๊ณ ํ๊ฒฝ๋ณ์๋ก ๋ถ๋ฆฌํ ๋ค, application.yml์์ ์ฐธ์กฐํ๋๋ก ๊ตฌ์ฑํ๋ค.
jwt:
secret: ${JWT_SECRET}
๋ก์ปฌ ํ๊ฒฝ์ application-local.yml์ ๋ณ๋๋ก ๊ด๋ฆฌํ๊ฑฐ๋, .env ํ์ผ๋ก ๋ถ๋ฆฌํด๋๋ ๋ฐฉ์์ด ๊น๋ํ๋ค.
5. ์ ๋ฐํ์์ด ์๋๋ผ ์์ ์์ ์ ํฐ์ง๋๊ฐ
์ฒ์์๋ ์์ฒญ์ ์ฒ์ ์ฒ๋ฆฌํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ, ์ ์๋ฒ ์์ ์์ ์ ๋ฐ๋ก ์คํจํ๋์ง ์๋ฌธ์ด ๋ค์๋ค.
์ด์ ๋ jjwt๊ฐ ์๋์ ์ผ๋ก ์ด๊ธฐํ ์์ ์ ํค ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ธฐ ๋๋ฌธ์ด๋ค. @PostConstruct๋ก ํค๋ฅผ ์ด๊ธฐํํ๋ ์์ ์ ์คํ ๋ฏธ๋ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ๊ธฐ์ค์ ๋ง์กฑํ์ง ๋ชปํ๋ฉด ์ฆ์ ์์ธ๋ฅผ ๋์ง๋ค.
์๋ชป๋ ํค๋ก ์๋ฒ๊ฐ ๋ฌ ๋ค ์ธ์ฆ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ๋ณด๋ค, ์์ ์๋ฒ๊ฐ ์์๋์ง ๋ชปํ๊ฒ ๋ง๋ ์ชฝ์ด ๋ ์์ ํ๋ค. ์ด๋ฐ ๋ฐฉ์์ fail-fast๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์คํ ๋ฏธ๋ฌ ํค๋ก ์๋ช ๋ ํ ํฐ์ด ์ค์ ํธ๋ํฝ์์ ์ฌ์ฉ๋๋ ์ํฉ ์์ฒด๋ฅผ ๋ง๋๋ค๋ ์ ์์, jjwt์ ์ด๊ธฐํ ์์ ๊ฒ์ฆ์ ๋ณด์ ์ธก๋ฉด์์๋ ์ฌ๋ฐ๋ฅธ ์ค๊ณ๋ผ๊ณ ๋ณผ ์ ์๋ค.
6. ๋ฐฐ์ด ์
- HMAC-SHA256 ๊ธฐ์ค secret ํค๋ ์ต์ 32๋ฐ์ดํธ, ์ฆ 256๋นํธ ์ด์์ด์ด์ผ ํ๋ค.
- jjwt๋ ์คํ ๋ฏธ๋ฌ ํค๋ฅผ ๋ฐํ์์ด ์๋๋ผ ์ด๊ธฐํ ์์ ์ ์ฐจ๋จํ๋ค.
- ์ด์ ํ๊ฒฝ์์๋ secret ๊ฐ์ ์ค์ ํ์ผ์ ์ง์ ์์ฑํ์ง ๋ง๊ณ ํ๊ฒฝ๋ณ์๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
- ์ด์ secret์ ์ง์ ์์ฑํ ๋ฌธ์์ด๋ณด๋ค ์ถฉ๋ถํ ๊ธธ์ด์ ๋๋ค ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํ๋ค.