์๋ฒ or DB์ ์ธ์ฆ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ธ์ ํํ๋ก ์ธ์ ์ ์ฅ์์ ์ ์ฅ ํ๋ ๋ฐฉ์
์ธ์ฆ๋ ์ฌ์ฉ์์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์ ํต์ ์ธ ๋ฐฉ์
( ์ฌ์ฉ์์ ๊ณ ์ ์ธ์
ID๊ฐ ํด๋ผ์ด์ธํธ์ ์ฟ ํค์ ์ ์ฅ๋์ด ์ธ์ฆ ์๋จ์ผ๋ก ์ฌ์ฉ )
์๋์ ์ผ๋ก ์ ์ ๋คํธ์ํฌ ํธ๋ํฝ ์ฌ์ฉ
( ์ธ์
ID๋ง ํด๋ผ์ด์ธํธ ์ชฝ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ )
๋ณด์์ฑ ์ธก๋ฉด์์ ์กฐ๊ธ ๋ ์ ๋ฆฌ
( ์๋ฒ ์ธก์์ ์ธ์
์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ )
์๋ฒ์ ํ์ฅ์ฑ ๋ฉด์์๋ ์ธ์
๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์
( ์ธ์ฆ๋ ์ฌ์ฉ์ request์ ์ํ๋ฅผ ์ ์งํด์ผํ๊ธฐ ๋๋ฌธ )
โ Sticky Session, Session Clustering, Session ์ ์ฅ์์ ์ธ๋ถ ๋ถ๋ฆฌ ๋ฑ์ ์์
์ ํตํด ๋ณด์
Sticky Session๊ณผ Session Clustering ์ฐธ๊ณ
Sticky Session ์ฐธ๊ณ
Session Clustering ์ฐธ๊ณ 1
Session Clustering ์ฐธ๊ณ 2
์ธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์๋ฒ์ ๋ถ๋ด์ด ๊ฐ์ค
SSR(Server Side Rendering) ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ ๋ฐฉ์
โ HTTP ํ๋กํ ์ฝ์ ํน์ง์ธ ๋น์ฐ๊ฒฐ์ฑ(Connectionless) / ๋น์ํ์ฑ(Stateless)์ ๋ณด์ํ์ฌ, ์ธ์ฆ๋ ์ฌ์ฉ์์ request์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์๋จ์ด ์ธ์
ํ ํฐ์ ํฌํจ๋ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์๋ฒ ์ธก์์ ๋ณ๋๋ก ๊ด๋ฆฌ X
์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํฌํจ๋ ํ ํฐ์ ํค๋์ ํฌํจ์์ผ์, request ์ ์ก ์ ์ธ์ฆ ์๋จ์ผ๋ก ์ฌ์ฉ
์ธ์
์ ๋นํด ์๋์ ์ผ๋ก ๋ง์ ๋คํธ์ํฌ ํธ๋ํฝ ์ฌ์ฉ
( ํ ํฐ ๋ด์ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด ๋ฑ์ ํฌํจํ๊ธฐ ๋๋ฌธ )
๋ณด์์ฑ ์ธก๋ฉด์์ ์กฐ๊ธ ๋ ๋ถ๋ฆฌ
( ์๋ฒ ์ธก์์ ํ ํฐ์ ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ )
์๋ฒ์ ํ์ฅ์ฑ ๋ฉด์์ ์ ๋ฆฌํ๊ณ , ์ธ์
๋ถ์ผ์น ๊ฐ์ ๋ฌธ์ ๋ฐ์ X
( ์ธ์ฆ๋ ์ฌ์ฉ์ request์ ์ํ๋ฅผ ์ ์งํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ )
๋ฏผ๊ฐํ ์ ๋ณด๋ ํ ํฐ์ ํฌํจ์ํค์ง ๋ง์์ผ ํจ
( ํ ํฐ์ ํฌํจ๋๋ ์ฌ์ฉ์ ์ ๋ณด๋ ํ ํฐ ํน์ฑ์ ์ํธํ X์ด๊ธฐ ๋๋ฌธ )
ํ ํฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง๋ ๋ฌดํจํ X
โ key/value ์์ ํํ๋ก ์ ์ฅ๋๋ Redis ๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ DB์ ๋ฌดํจํ ์ํค๊ณ ์ ํ๋ ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ์งง๊ฒ ์ฃผ์ด ํด๋น ํ ํฐ์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ๋ ๋ฑ์ ๋ฐฉ๋ฒ ์ฌ์ฉํ์ฌ ๋ณด์
CSR(Client Side Rendering) ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ ๋ฐฉ์
Ex. ๋ก๊ทธ์ธ ์์ฒญ์ ๊ฐ์ ํ๋ฉด,
โ ํด๋ผ์ด์ธํธ โ ์๋ฒ
๐ Username/Password ๋ด์ ๋ก๊ทธ์ธ ์์ฒญ
โก ์๋ฒ - DB
๐ Username/Password ๊ฐ ์ผ์นํ๋์ง ํ์ธ
โ
๐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ผ ์ํธํ ๋ ํ ํฐ ์์ฑ
Access Token
/ Refresh Token
๋ชจ๋ ์์ฑ
ํ ํฐ์ ๋ด๊ธธ ์ ๋ณด(Payload)๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ ์ ๋ณด, ์ฌ์ฉ์์ ๊ถํ ์ ๋ณด ๋ฑ
Refresh Token
์ ์ด์ฉํด ์๋ก์ด Access Token
์ ์์ฑํ ๊ฒ์ด๋ฏ๋ก ๋ ์ข
๋ฅ์ ํ ํฐ์ด ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด์ ํ์๋ X
โข ์๋ฒ โ ํด๋ผ์ด์ธํธ
๐ ํ ํฐ ์ ์ก
โฃ ํด๋ผ์ด์ธํธ
๐ ํ ํฐ ์ ์ฅ
( ์ ์ฅํ๋ ์์น๋ Local Storage, Session Storage, Cookie ๋ฑ )
( ์ด ํ, ๋ค์ ์์ฒญ์์ )
โค ํด๋ผ์ด์ธํธ โ ์๋ฒ
๐ HTTP Header(Authorization Header) or ์ฟ ํค์ ํ ํฐ์ ๋ด์ request ์ ์ก
( Bearer authentication ์ด์ฉ )
[Bearer authentication ์ฐธ๊ณ ]
์์ฝ - https://learning.postman.com/docs/sending-requests/authorization/#bearer-token
์์ธ - https://www.rfc-editor.org/rfc/rfc6750
โฅ ์๋ฒ
๐ ํ ํฐ ๊ฒ์ฆ ํ, ์ผ์นํ ๊ฒฝ์ฐ ์์ฒญ ์ฒ๋ฆฌ ํ ์๋ต
( ์๋ฒ๊ฐ ๋ฐ๊ธํ๋ ํ ํฐ์ด ๋ง์ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌ ํ ์๋ต ๋ณด๋ )
Json ํฌ๋งท์ผ๋ก ์ฌ์ฉ์์ ๋ํ ์์ฑ์ ์ ์ฅํ๋ ์น ํ ํฐ
๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์กํ๊ธฐ ์ํด ๊ณ ์๋ ์ธํฐ๋ท ํ์ค ์ธ์ฆ ๋ฐฉ์
ํ ํฐ ์ธ์ฆ ๋ฐฉ์์์ ๊ฐ์ฅ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ
JSON ํฌ๋งท์ ํ ํฐ ์ ๋ณด๋ฅผ ์ธ์ฝ๋ฉ ํ, ์ธ์ฝ๋ฉ ๋ ํ ํฐ ์ ๋ณด๋ฅผ Secret Key๋ก ์๋ช (Sign)ํ ๋ฉ์์ง๋ฅผ Web Token์ผ๋ก์จ ์ธ์ฆ ๊ณผ์ ์ ์ฌ์ฉ
[์ฐธ๊ณ ] https://jwt.io/introduction
โ๏ธ ์ก์ธ์ค ํ ํฐ (Access Token)
๋ณดํธ๋ ์ ๋ณด๋ค(์ฌ์ฉ์์ ์ด๋ฉ์ผ, ์ฐ๋ฝ์ฒ, ์ฌ์ง ๋ฑ)์ ์ ๊ทผํ ์ ์๋ ๊ถํ๋ถ์ฌ์ ์ฌ์ฉ
ํด๋ผ์ด์ธํธ๊ฐ ์ฒ์ ์ธ์ฆ์ ๋ฐ๊ฒ ๋ ๋(๋ก๊ทธ์ธ ์), Access Token
๊ณผ Refresh Token
๋ ๊ฐ์ง๋ฅผ ๋ค ๋ฐ์ง๋ง, ์ค์ ๋ก ๊ถํ์ ์ป๋ ๋ฐ ์ฌ์ฉํ๋ ํ ํฐ์ Access Token
ํ์ทจ๋๋๋ผ๋ ์ค๋ซ๋์ ์ฌ์ฉํ ์ ์๋๋ก ๋น๊ต์ ์งง์ ์ ํจ๊ธฐ๊ฐ
โ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋๋ค๋ฉด Refresh Token
์ ์ฌ์ฉํ์ฌ ์๋ก์ด Access Token
์ ๋ฐ๊ธ๋ฐ์
( ๋ค์ ๋ก๊ทธ์ธ ์ธ์ฆ ํ์ X )
โ๏ธ ๋ฆฌํ๋ ์ ํ ํฐ (Refresh Token)
Access Token
๋ฐ๊ธ๋ฐ์ ๋ ์ฌ์ฉ
๊ธด ์ ํจ๊ธฐ๊ฐ
โ But, ์ ํจ๊ธฐ๊ฐ์ด ๊ธธ์ด ํ์ทจ๋นํ๋ค๋ฉด ํฐ ํผํด๊ฐ ์ฌ ์ ์๊ธฐ ๋๋ฌธ์,
์ฌ์ฉ์์ ํธ์๋ณด๋ค ์ ๋ณด๋ฅผ ์งํค๋ ๊ฒ์ด ๋ ์ค์ํ ์น ์ ํ๋ฆฌ์ผ์ด์
์ Refresh Token
์ ์ฌ์ฉํ์ง ์๋ ๊ณณ์ด ๋ง์
Refresh Token ๋ฐ๊ธ ๊ธฐ๊ฐ ์ฐธ๊ณ
โ ์ธ์์ ์๋ฒฝํ ๋ณด์์ ์์ผ๋ฏ๋ก ๊ฐ ์ฅ๋จ์ ์ ์ฐธ๊ณ ํ์ฌ ํ์์ ๋ง๊ฒ ์ฌ์ฉํ๊ธฐ
( . ์ ๊ธฐ์ค์ผ๋ก Header / Payload / Signature ์ธ ๋ถ๋ถ์ผ๋ก ๋๋จ )
โ๏ธ Header
์ด๋ค ์ข
๋ฅ์ ํ ํฐ์ธ์ง(์ง๊ธ์ ๊ฒฝ์ฐ์ JWT), ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํํ ์ง ์ ์
( JSON ํฌ๋งท ํํ๋ก ์ ์ )
JSON ๊ฐ์ฒด๋ฅผ base64 ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํ๋ฉด JWT์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ด ์์ฑ
โ๏ธ Payload
์๋ฒ์์ ํ์ฉํ ์ ์๋ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์
Ex. ์ ๊ทผ ๊ถํ / ์ฌ์ฉ์ ๋ฐ์ดํฐ ๋ฑ
๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ด์ง ์๋ ๊ฒ์ด ์ข์
Ex. password
JSON ๊ฐ์ฒด๋ฅผ base64 ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํ๋ฉด JWT์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ด ์์ฑ
โ๏ธ Signature
( base64๋ก ์ธ์ฝ๋ฉ๋ ์ฒซ ๋ฒ์งธ, ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ๋ถ๋ถ์ด ์์ฑ๋์๋ค๋ฉด, )
์ํ๋ ๋น๋ฐ ํค(Secret Key)
+ Header์์ ์ง์ ํ ์๊ณ ๋ฆฌ์ฆ
์ ์ฌ์ฉํ์ฌ Header์ Payload์ ๋ํด์ ๋จ๋ฐฉํฅ ์ํธํ ์ํEx. HMAC SHA256 ์๊ณ ๋ฆฌ์ฆ(์ํธํ ๋ฐฉ๋ฒ ์ค ํ๋) ์ฌ์ฉํ๋ค๋ฉด,
HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret);
์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก Signature๊ฐ ์์ฑ๋จ
๋ฌด์ํ์ฑ (Statelessness) & ํ์ฅ์ฑ (Scalability)
ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด ์ ์ฅํ ํ์ X / ํ ํฐ์ด ์ ์์ ์ผ๋ก ๊ฒ์ฆ๋๋์ง๋ง ํ๋จ
โ ์๋ฒ์ DB์ ๋ถ๋ด ๋์ด์ค
ํด๋ผ์ด์ธํธ๊ฐ request ์ ์กํ ๋ ๋ง๋ค ํค๋์ ํ ํฐ์ ํฌํจ์์ผ ์ ์ก
โ ํ๋์ ํ ํฐ์ผ๋ก ์ฌ๋ฌ ์๋ฒ์ ์ธ์ฆ ๊ฐ๋ฅ
( ์ธ์
๋ฐฉ์์ด๋ผ๋ฉด ๋ชจ๋ ์๋ฒ๊ฐ ํด๋น ์ฌ์ฉ์์ ์ธ์
์ ๋ณด๋ฅผ ๊ณต์ ํ๊ณ ์์ด์ผ ํจ )
ํด๋ผ์ด์ธํธ๊ฐ request๋ฅผ ์ ์กํ ๋ ๋ง๋ค ์ธ์ฆ ์ ๋ณด ์ ์กํ ํ์ ์์
์์ ์ฑ
์ํธํํ ํ ํฐ ์ฌ์ฉ
์ํธํ ํค๋ฅผ ๋ ธ์ถํ ํ์ X
์ด๋์๋ ์์ฑ ๊ฐ๋ฅ
ํ ํฐ์ ์์ฑํ๋ ์๋ฒ๊ฐ ๊ผญ ๊ทธ ํ ํฐ์ ๋ง๋ค์ง ์์๋ ๋๊ณ ,
ํ ํฐ ์์ฑ์ฉ ์๋ฒ๋ฅผ ๋ง๋ค๊ฑฐ๋, ๋ค๋ฅธ ํ์ฌ์์ ํ ํฐ ๊ด๋ จ ์์
์ ๋งก๊ธฐ๋ ๊ฒ ๋ฑ ๋ค์ํ ํ์ฉ ๊ฐ๋ฅ
์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ฅผ ์ง์ ๊ด๋ฆฌํ์ง ์๊ณ , ๋ค๋ฅธ ํ๋ซํผ์ ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ก ์ธ์ฆ ๊ฐ๋ฅ
Ex. Github / Google ๋ฑ
๊ถํ ๋ถ์ฌ์ ์ฉ์ด
Payload ๋์ฝ๋ฉ์ด ์ฉ์ด
โ ํ์ทจํ์ฌ ๋์ฝ๋ฉ ํ ๋ฐ์ดํฐ ํ์ธ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ํฌํจ X
ํ ํฐ์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ฉด ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์์
โ ํ ํฐ์ ์ ์ฅํ๋ ์ ๋ณด์ ์์ด ๋ง์์ง ์๋ก ํ ํฐ์ ๊ธธ์ด๋ ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์
request ์ ์ก ์ ๋ง๋ค ๊ธด ํ ํฐ ์ ์กํ๋ฉด ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์์
ํ ํฐ์ ์๋์ผ๋ก ์ญ์ ๋์ง ์์
โ ๋, ํ์ทจ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ์ ๋ฐ๋์ ๊ธธ์ง ์์ ํ ํฐ ๋ง๋ฃ ๊ธฐ๊ฐ ์ถ๊ฐํ๊ธฐ
( ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ธ์ฆ ์ฑ๊ณต ํ, JWT๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋๋ ๊ณผ์ )
โ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ ์ธก์ ๋ก๊ทธ์ธ ์ธ์ฆ ์์ฒญ(Username/Password๋ฅผ ์๋ฒ ์ธก์ ์ ์ก)
๐ฌ ํด๋ผ์ด์ธํธ :
์๋ฒ์ผ, ์ด Username/Password๋ก ๋ก๊ทธ์ธ ์ธ์ฆ ์ข ํด์ค
โก ๋ก๊ทธ์ธ ์ธ์ฆ์ ๋ด๋นํ๋ Security Filter(JwtAuthenticationFilter)๊ฐ ํด๋ผ์ด์ธํธ์ ๋ก๊ทธ์ธ ์ธ์ฆ ์ ๋ณด ์์
๐ฌ Security Filter (JwtAuthenticationFilter) :
OK ๋ด๊ฐ ๋ฐ์.
โข Security Filter๊ฐ ์์ ํ ๋ก๊ทธ์ธ ์ธ์ฆ ์ ๋ณด๋ฅผ AuthenticationManager์๊ฒ ์ ๋ฌํด ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์์
๐ฌ Security Filter (JwtAuthenticationFilter) :
์ผ AuthenticationManager, ๋ก๊ทธ์ธ ์ธ์ฆ ์ ๋ณด ์คํ ๋๊น ๋ค๊ฐ ๋์ ์ธ์ฆ ์ฒ๋ฆฌํด.
โฃ AuthenticationManager๊ฐ Custom UserDetailsService(MemberDetailsService)์๊ฒ ์ฌ์ฉ์์ UserDetails ์กฐํ๋ฅผ ์์
๐ฌ AuthenticationManager :
OK ๋ด๊ฐ ํจ.
์ผ UserDetailsService(MemberDetailsService), ์ด ์ฌ์ฉ์ UserDetails ์กฐํ ํ๋ฒ ํด๋ด๋ผ.
โค Custom UserDetailsService(MemberDetailsService)๊ฐ ์ฌ์ฉ์์ ํฌ๋ฆฌ๋ด์ ์ DB์์ ์กฐํํ ํ, AuthenticationManager์๊ฒ ์ฌ์ฉ์์ UserDetails๋ฅผ ์ ๋ฌ
๐ฌ UserDetailsService (MemberDetailsService) :
OK ๋ด๊ฐ ํจ.
์ผ AuthenticationManager, ๊ทธ ์ฌ์ฉ์ ํฌ๋ฆฌ๋ด์ ์กฐํํด๋ดค๋๋ ์ด UserDetails ๋์์ด.
๋ ์ค๊ฒ.
โฅ AuthenticationManager๊ฐ ๋ก๊ทธ์ธ ์ธ์ฆ ์ ๋ณด์ UserDetails์ ์ ๋ณด๋ฅผ ๋น๊ตํด ์ธ์ฆ ์ฒ๋ฆฌ
๐ฌ AuthenticationManager :
OK ๋ฐ์.
๊ทธ๋ผ ๋ด๊ฐ ์๊น Security Filter(JwtAuthenticationFilter)๊ฐ ์ค ๋ก๊ทธ์ธ ์ธ์ฆ ์ ๋ณด๋ ๋ค๊ฐ ์ค UserDetails๋ ๋น๊ตํด์ ๊ฐ์ ์ฌ์ฉ์์ธ์ง ๋ณผ๊ฒ.
โฆ JWT ์์ฑ ํ, ํด๋ผ์ด์ธํธ์ ์๋ต์ผ๋ก ์ ๋ฌ
๐ฌ AuthenticationManager :
๊ฐ์ ์ฌ์ฉ์์ธ ๊ฑฐ ์ธ์ฆ ๋์ผ๋๊น JWT ์์ฑํด์ ์๋ต์ผ๋ก ์ค๊ฒ.
โ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์
JwtAuthenticationFilter
(โก,โข,โฆ) / MemberDetailsService
(โค) ๊ตฌํ
( โฃ,โฅ์ Spring Security์ AuthenticationManager๊ฐ ๋์ ์ฒ๋ฆฌํด ์ค )
์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
implementation 'org.springframework.boot:spring-boot-starter-security' // (1) Spring Security ์ ์ฉํ๊ธฐ ์ํด โ โ // (2) JWT ๊ธฐ๋ฅ์ ์ํ jjwt ๋ผ์ด๋ธ๋ฌ๋ฆฌ ( Spring Security ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ JWT ์ ์ฉํ๊ธฐ ์ํด ) implementation 'io.jsonwebtoken:jjwt-api:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
โ JWT๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋
jjwt
๋Java JWT
๊ฐ์ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์
jjwt ์ฐธ๊ณ
java-jwt ์ฐธ๊ณ
SecurityConfigurationV1
ํด๋์ค ์ถ๊ฐ
CORS ์ฐธ๊ณ 1
CORS ์ฐธ๊ณ 2
ํ์ ๊ฐ์ ๋ก์ง ์์
3-1. MemberDto.Post
ํด๋์ค์ ํจ์ค์๋ ํ๋ ์ถ๊ฐ
3-2. Member
์ํฐํฐ ํด๋์ค์ ํจ์ค์๋ ํ๋ ์ถ๊ฐ
3-3. MemberService
ํด๋์ค์ ์ฌ์ฉ์ ๋ฑ๋ก ์, ํจ์ค์๋์ ์ฌ์ฉ์ ๊ถํ ์ ์ฅ
3-4. CustomAuthorityUtils
ํด๋์ค ์ถ๊ฐ
โ MemberService
ํด๋์ค์ DI ํ๊ธฐ ์ํจ
โ ํต์ฌ
โ ์ฌ์ฉ์์ Username(์ด๋ฉ์ผ ์ฃผ์)๊ณผ Password ๋ก ๋ก๊ทธ์ธ ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด,
๋ก๊ทธ์ธ ์ธ์ฆ์ ์ฑ๊ณตํ ์ฌ์ฉ์์๊ฒ JWT ๋ฅผ ์์ฑ ๋ฐ ๋ฐ๊ธํ๋ ๊ฒ
MemberDetailsService
ํด๋์ค ์ถ๊ฐ
โ Custom UserDetailsService ๊ตฌํ
LoginDto
ํด๋์ค ์ถ๊ฐ
โ ํด๋ผ์ด์ธํธ์ Username + Password ์ ๋ณด๋ง ๋ด๋ ๋จ์ํ DTO ํด๋์ค
โ ๋ก๊ทธ์ธ ์ธ์ฆ ์ ๋ณด ์ญ์ง๋ ฌํ(Deserialization)๋ฅผ ์ํจ
JwtTokenizer
ํด๋์ค ์ถ๊ฐ
โ JWT ์์ฑ
JwtAuthenticationFilter
ํด๋์ค ์ถ๊ฐ ( Custom Security Filter )
โ ๋ก๊ทธ์ธ ์ธ์ฆ ์์ฒญ ์ฒ๋ฆฌ
SecurityConfigurationV2
ํด๋์ค์ ์ค์ ์ถ๊ฐ
โ Custom Filter ์ถ๊ฐ๋ฅผ ์ํด
โ JwtAuthenticationFilter ๋ฅผ Spring Security Filter Chain ์ ์ถ๊ฐํด์ ๋ก๊ทธ์ธ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋๋ก
๐ ์ด ํ, postman์ผ๋ก member ๋ฑ๋ก ํ,
/v11/auth/login
๊ฒฝ๋ก๋ก username / passwordpost
ํ๋ฉด ๋ก๊ทธ์ธ์ด ์ธ์ฆ๋์ด
Headers ํญ์์ Authorization ํค์ ๊ฐ์ผ๋ก Access Token,
Refresh ํค์ ๊ฐ์ผ๋ก Refresh Token ํฌํจ๋์ด ๋ํ๋จ
โ
โ ํด๋ผ์ด์ธํธ ์ชฝ์์ ์๋ฒ ์ธก์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ request ์ ์กํ ๋ ๋ง๋ค
์ ๋ฌ ๋ฐ์ JWT ๋ฅผ request header ์ ํฌํจ ํ,
ํด๋ผ์ด์ธํธ์ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด๋ก ์ฌ์ฉํ๋ฉด ๋จ !
AuthenticationSuccessHandler
ํด๋์ค ์ถ๊ฐ
โ ๋ก๊ทธ๋ฅผ ๊ธฐ๋ก or ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ response๋ก ์ ์กํ๋ ๋ฑ์ ์ถ๊ฐ ์ฒ๋ฆฌ
AuthenticationSuccessHandler ์ฐธ๊ณ
AuthenticationFailureHandler
ํด๋์ค ์ถ๊ฐ
โ ๋ก๊ทธ์ธ ์ธ์ฆ ์คํจ ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์ฆ ์คํจ์ ๋ํด ์ถ๊ฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
AuthenticationFailureHandler ์ฐธ๊ณ
SecurityConfigurationV3
ํด๋์ค์ ์ค์ ์ถ๊ฐ
โ AuthenticationSuccessHandler
/ AuthenticationFailureHandler
์ถ๊ฐ
โ
AuthenticationSuccessHandler
์ธํฐํ์ด์ค์AuthenticationFailureHandler
์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ฅผJwtAuthenticationFilter
์ ๋ฑ๋กํ๋ฉด ๋ก๊ทธ์ธ ์ธ์ฆ ์, ๋ ํธ๋ค๋ฌ ์ฌ์ฉ ๊ฐ๋ฅ
JwtAuthenticationFilter
ํด๋์ค์ ์ค์ ์ถ๊ฐ
โ AuthenticationSuccessHandler
ํธ์ถ ์ฝ๋ ์ถ๊ฐ
โ ์๊ฒฉ ์ฆ๋ช ์ด ํ์ํ request ์ ์ก ์, request header ๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ JWT ๋ฅผ ์๋ฒ ์ธก์์ ๊ฒ์ฆํ๋ ๊ธฐ๋ฅ ๊ตฌํ
JwtVerificationFilter
ํด๋์ค ์ถ๊ฐSecurityConfigurationV4
ํด๋์ค์ ์ค์ ์ถ๊ฐJwtVerificationFilter
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ธ์
์ ์ฑ
์ค์ + JwtVerification
์ถ๊ฐโ 1๋ฒ์์ ๊ฒ์ฆ ์ฑ๊ณตํ๋ฉด Authentication ๊ฐ์ฒด๋ฅผ SecurityContext์ ์ ์ฅํ๋๋ฐ stateless ํน์ง์ ์ ์งํ๊ธฐ ์ํด ์ธ์ ์ ์ง ๊ธฐ๊ฐ์ ์์ฃผ ์งง๊ฒ(๊ฑฐ์ ๋ฌด์ํ) ์ฃผ๊ธฐ ์ํด ์ค์ ์ถ๊ฐ
SecurityConfigurationV5
ํด๋์ค ์ถ๊ฐSecurityConfigurationV4
+ ์ ๊ทผ ๊ถํ ์ค์ โ
SecurityConfigurationV4
ํด๋์ค๋ ์ ๊ทผ ๊ถํ์ด .anyRequest().permitAll() ๋ก ๋์ด์์ด ๋ชจ๋ ์ ๊ทผ ๊ฐ๋ฅ
์ง๊ธ๊น์ง๋ JwtVerificationFilter
์์ SignatureException๊ณผ ExpiredJwtException์ ๋ํด ์ด๋ค ์ฒ๋ฆฌ๋ ํ์ง ์๊ณ ์์
โ๏ธ SignatureException
โ JWT ์ ๋ํ ์๋ช (Signature) ๊ฒ์ฆ์ ์คํจํ ๊ฒฝ์ฐ throw๋๋ ์์ธ
โ๏ธ ExpiredJwtException
โ JWT ๊ฐ ๋ง๋ฃ๋ ๊ฒฝ์ฐ throw๋๋ ์์ธ
JwtVerificationFilter
ํด๋์ค์ ์์ธ ์ฒ๋ฆฌ ๋ก์ง ์ถ๊ฐ
โ JWT ๊ฒ์ฆ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ Exception์ ์ฒ๋ฆฌํ ์ ์๋๋ก
AuthenticationEntryPoint ์ฐธ๊ณ
MemberAuthenticationEntryPoint
ํด๋์ค ์ถ๊ฐ
โ AuthenticationException์ด ๋ฐ์ํ ๋ ํธ์ถ๋๋ ํธ๋ค๋ฌ ๊ฐ์ ์ญํ
โ ์ฌ๊ธฐ์๋ AuthenticationException ๋ฐ์ํ๋ฉด ErrorResponse ๋ฅผ ์์ฑํด์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ๋๋ก ๊ตฌํ
โ๏ธ AuthenticationException
โ ๋ํ์ ์ผ๋ก SecurityContext ์ Authentication ์ด ์ ์ฅ๋์ง ์์์ ๋ ๋ฐ์ํ๋ ์๋ฌ
ErrorResponse
ํด๋์ค ์ถ๊ฐ
โ AuthenticationException ๋ฐ์ํ๋ฉด ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ ํด๋์ค
MemberAccessDeniedHandler
ํด๋์ค ์ถ๊ฐ
โ ์ธ์ฆ์๋ ์ฑ๊ณตํ์ง๋ง ํด๋น ๋ฆฌ์์ค์ ๋ํ ๊ถํ์ด ์์ ๊ฒฝ์ฐ ํธ์ถ๋๋ ํธ๋ค๋ฌ
AccessDeniedHandler ์ฐธ๊ณ
SecurityConfiguration
ํด๋์ค ์ถ๊ฐ
โ MemberAuthenticationEntryPoint
/ MemberAccessDeniedHandler
์ฌ์ฉํ ์ ์๋๋ก ์ถ๊ฐ
โ Username/Password ๊ธฐ๋ฐ์ ๋ก๊ทธ์ธ ์ธ์ฆ์
OncePerRequestFilter
๊ฐ์ Spring Security์์ ์ง์ํ๋ ๋ค๋ฅธ Filter ์ด์ฉํด์๋ ๊ตฌํ ๊ฐ๋ฅํ๊ณ ,
Controller์์ REST API ์๋ํฌ์ธํธ๋ก ๊ตฌํํ๋ ๊ฒ๋ ๊ฐ๋ฅํจ
OncePerRequestFilter ์ฐธ๊ณ 1
OncePerRequestFilter ์ฐธ๊ณ 2
๊ทธ๋๋ Spring Security ๊ธฐ๋ณธ์์ ๋ฐฐ์ ๋ ๊ฑฐ์ ๋ํด์ ธ์ ๋ฐฐ์ฐ๋ ๊ทธ๋๋ ๋ซ๋ค ..!
ํ์ง๋ง ์ฌ์ ํ ์ด๋ ค์ ..