[Spring Security] SecurityContextHolder๋?
๋ฆฌํ๋ ์ฌ ํ ํฐ์ DB์๋ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์
Entity๋ Repository๊น์ง ๋ง๋ค์ด์ค ์ํ
์ด์ ํ ํฐ ํํฐ๋ฅผ ๋ง๋ค ์ฐจ๋ก์.
ํํฐ๋ ์ ๋ฌ๋๊ธฐ ์ ํ์
URLํจ๋ก์ ๋ง๋ ๋ชจ๋ ์์ฒญ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด ์์.
HTTP์์ฒญ์ด controller๊น์ง ๋๋ฌํ๊ธฐ ์ /ํ์ ์๋.
์์ฒญ์ด ์ค๋ฉด, ํค๋๊ฐ ๋น๊ตํด์ ํ ํฐ ์๋์ง ํ์ธํจ.
์ ํจ์ฑ ํ์ธํ๊ณ
์ ํจํ ํ ํฐ์ด๋ฉด Security Context Holder(ํด๋์ค)์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํจ.
** SecurityContextHolder๋ ์์์๋ ์ ๊น ์ธ๊ธํ ์ ์๋๋ฐ,
์ธ์ฆ ๊ฐ์ฒด(Authentication)๊ฐ ์ ์ฅ๋๋ ๊ณณ์.
(๊ทธ๋์ getAuthentication()๋ฉ์๋๊ฐ ์ฃผ๋ก ํธ์ถ๋๋๊ณณ์ด ํํฐ๋ผ๊ณ ๋ค์)
๋ฐ๋ผ์ ์ฌ๊ธฐ์ ์ธ์ฆ ๊ฐ์ฒด ๊บผ๋ด์ ์ฌ์ฉํ ์ ์์.
์ด ํด๋์ค๋ ์ค๋ ๋๋ง๋ค ๊ณต๊ฐ์ ํ ๋น(thred local)ํจ -> ์๋ฌด๊ณณ์์๋ ์ฐธ์กฐ ๊ฐ๋ฅ
์ด๋ฌํ SecurityContext ๊ฐ์ฒด๋ค์ ์ ์ฅํ๋ ๊ฐ์ฒด๊ฐ SecurityContextHolder์.

SecurityContextHolder๋ ์ค๋ ๋ ๋ก์ปฌ ์ ์ฅ์์.
์ฆ ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๋ ๊ณต๊ฐ์
Authentication๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ์ฅํ๋ ์ญํ ์ ํจ.

์ดํด๊ฐ ์ ์๊ฐ์ ์งํผํฐํํ ํ๋ฆ ๋ฌผ์ด๋ณด๋๊น
์ดํดํ๊ธฐ ์ฝ๊ฒ ์ ์ค๋ช ํด์คฌ์.
โ ํ๋ง๋ ์ ๋ฆฌ
SecurityContextHolder ํด๋์ค๋ SecurityContext ๊ฐ์ฒด๋ฅผ ์ค๋ ๋๋ณ๋ก ๋ณด๊ดํ๊ณ , ๊ทธ ์์๋ Authentication ๊ฐ์ฒด๊ฐ ๋ค์ด ์๋ค. ์ด๊ฑธ ๊บผ๋ด์ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ค.
์ฌ๊ธฐ์ ์๋ฌธ์ ์ด ๊ถ๊ธํ๊ฒ ์๊ฒผ์
์ DB์์ ์ ๊บผ๋ด๊ณ SecurityContextHolder์์ ๊บผ๋ด๋?
์ธ์ฆ๋ ๋ค์์ด๋ฉด DB์์ ๊ฐ์ ธ์ค๋๊ฒ ๋ซ์ง ์๋?
๋งค ์์ฒญ๋ง๋ค DB์๋ค๊ฐ๋ค ํ๋๊ฒ ๋นํจ์จ์ ์ด๊ธฐ๋๋ฌธ.
๋ฐ๋ผ์ DB์์ ์ฌ์ฉ์ ์กฐํ ํ๋ค์์, Authentication๊ฐ์ฒด ๋ง๋ค๊ณ
๊ทธ ๊ฐ์ฒด๋ฅผ SecurityContextHolder์ ์ ์ฅํด๋๊ณ
-> ์ดํ ์์ฒญ๋ค์ (ํํฐ์์ ํ ํฐ ์ ํจํ๋ฉด) Securitycontext์์ ์ธ์ฆ ์ ๋ณด ์ฌ์ฉํ๋๊ฒ
ํจ์ฌ ๋น ๋ฅด๊ณ ํจ์จ์ ์.
๋ค์ ์ด์ด์ ์ค๋ช ํ์๋ฉด,
SecurityContext๋ ์ธ์ฆ๊ฐ์ฒด(Authentication)๊ฐ ์ ์ฅ๋๋ ๋ณด๊ด์.
์ฌ๊ธฐ์ ์ธ์ฆ๊ฐ์ฒด ๊บผ๋ด์ ์ธ ์ ์๋๊ฑฐ์.
์ด ํด๋์ค๋ ์ค๋ ๋๋ง๋ค ๊ณต๊ฐ ํ ๋น(์ค๋ ๋ ๋ก์ปฌ)
-> ์๋ฌด๊ณณ์์๋ ์ฐธ์กฐ ๊ฐ๋ฅํ๊ณ , ๋ ๋ฆญ์ ์ฌ์ฉ ๊ฐ๋ฅ
---> ์ด๋ฌํ SecurityContext๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด๊ฐ
SecurityContextHolder์.
๋ค์ ํฌ์คํ ์์ TokenAuthenticationFilter.java ์ฝ๋ ๊ตฌํํ๊ฑฐ ์ฌ๋ ค๋ณด๊ฒ ์.