DevLog ๐ถ
[Web] ์ธ์ฆ๊ณผ ์ธ๊ฐ๋? - ์ฟ ํค์ ์ธ์ ์ ๋ํด์ ์์๋ณด์! ๋ณธ๋ฌธ
[Web] ์ธ์ฆ๊ณผ ์ธ๊ฐ๋? - ์ฟ ํค์ ์ธ์ ์ ๋ํด์ ์์๋ณด์!
dolmeng2 2023. 5. 3. 22:08๐ฑ ๋ค์ด๊ฐ๊ธฐ ์
ํ ์ฝํก์์ ์งํํ ์ธ์ฆ๊ณผ ์ธ๊ฐ ๊ด๋ จ ์๋ฃ๋ค์ ๋ฐํ์ผ๋ก ๊ธ์ ์์ฑํ์์ต๋๋ค :D
๐ฑ ์ธ์ฆ (Authentication)
๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒ์ ํ์ฉํ๊ธฐ ์ด์ ์, ๋ฑ๋ก๋ ์ ์ ์ ์ ์์ ์ ์ฆํ๋ ๊ณผ์ ์ด๋ค.
์๋ณ ๊ฐ๋ฅํ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก, ์๋น์ค์ ๋ฑ๋ก๋ ์ ์ ์ ์ ์์ ์ ์ฆํ๋ ๊ณผ์ !
ex) ์ด๋ค ์ฌ์ดํธ์์ ๊ธ์ ์์ฑํ๊ธฐ ์ํด์๋ ํด๋น ์ฌ์ดํธ์ ํ์์ด์ด์ผ ํ๋ค.
'๋ก๊ทธ์ธํ์ง ์์ ํ์'์ ๊ฒฝ์ฐ ๊ธ์ ์์ฑํ ์ ์์ผ๋ฉฐ, ํด๋น ํ์์ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ณผ์ ์ด '์ธ์ฆ'์ด๋ค.
๐ฑ ์ธ๊ฐ (Authorization)
์์ฒญ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์๋ ์ธ์ฆ๋ ์ ์ ์ธ์ง ์ ์ฆํ๋ ๊ณผ์ ์ด๋ค.
ex) ๋ก๊ทธ์ธ๊น์ง๋ ์๋ฃํ๋๋ฐ, ํด๋น ์ฌ์ฉ์๋ ๊ทธ ์ฌ์ฉ์๊ฐ ์์ฑํ ๊ธ๋ง ์ ๊ฑฐํ๊ฑฐ๋ ์์ ์ด ๊ฐ๋ฅํ๋ค.
๊ฐ์ ๊ถํ์ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์์ฑํ ๊ธ์ ์์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ธ์ฆ ๊ณผ์ ์ด ์๋ ๋ค์์ ์ธ๊ฐ ๊ณผ์ ์ ์๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
'์ธ์ฆ๋์์ง๋ง ๊ถํ์ด ์๋ ์ํ'๋ ์ธ๊ฐ๋์ง ์์ ์ํ์ง๋ง, '์ธ๊ฐ๋์์ง๋ง ์ธ์ฆ๋์ง ์์๋ค'๋ ์กด์ฌํ ์ ์๋ ์ํฉ์ด๋ค.
๐ฌ HTTP Status Code - 401 vs 403
์ํ ์ฝ๋์ ๋ํด ์ฒ์ ๊ณต๋ถํ์ ๋ ๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ๊ฐ๋ ์ด์๋๋ฐ, ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ๋ฐ์ ํ ๊ด๋ จ์ด ์๋ค.
401๋ฒ์ ๊ฒฝ์ฐ Unauthorized, 403์ ๊ฒฝ์ฐ Forbidden์ธ๋ฐ, ์ธ์ฆ์ด 401, ์ธ๊ฐ๊ฐ 403์ ๋ํ ์ํ ์ฝ๋๊ฐ ๋๋ค.
401 (Unauthorized) | 403 (Forbidden) |
์ธ์ฆ ๊ด๋ จ | ์ธ๊ฐ ๊ด๋ จ |
์ธ์ฆ๋์ง ์์๊ฑฐ๋ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ (์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ ํจ) | ๊ถํ์ด ์๋ ์์์ ์์ฒญํ๋ ๊ฒฝ์ฐ (์ผ๋ฐ ์ฌ์ฉ์๊ฐ ๊ด๋ฆฌ์ ๊ถํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋) |
- ์ฐธ๊ณ ๋ก, 403์ด ๋ด๋ ค์๋ค๋ ๊ฒ์ '์ด๋ ํ ๋ฆฌ์์ค๊ฐ ์กด์ฌํ์ง๋ง ํด๋น ๋ฆฌ์์ค๋ ํน์ ์ฌ์ฉ์๋ง ๋ณผ ์ ์์ด์!' ๋ผ๊ณ ๋งํ๋ ๊ฒ๊ณผ ๋์ผํ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๋ค๋ฅด๊ฒ ํด์ํ๋ฉด ํด๋น URI์ ์ด๋ ํ ๋ฆฌ์์ค๊ฐ ์์์ ๋ดํฌํ๋ ๊ฒ์ผ๋ก๋ ์๋ฏธํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฆฌ์์ค๊ฐ ์ค์ํ ์ ๋ณด๋ผ๋ฉด, 403 ๋์ ์ ์์ 404์ ๋ด๋ ค์ค์ ์์์ ์กด์ฌ ์์ฒด๋ฅผ ์จ๊ธฐ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
๐ฑ HTTP stateless - ์ํ๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ง๊ฒ ํ ๊น?
HTTP์ ํน์ง์ผ๋ก ํฌ๊ฒ stateless (์ํ๊ฐ ์์) ์ connectionless (์ฐ๊ฒฐ์ฑ์ด ์์)๋ฅผ ๋ฝ์ ์ ์๋ค.
stateless์ ๊ฒฝ์ฐ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ๊ฐ ์์ฒญ์ ๊ตฌ๋ถํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
๋ฐฉ๊ธ ์ ์ ๋ฐ์ก๋ ์์ฒญ๊ณผ ์ง๊ธ ๋ฐ์กํ ์์ฒญ์ ๋ํด ์ด๋ ํ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง์ง ์์ผ๋ฉฐ, ๋ค์ค์ ์๋ฒ๊ฐ ์กด์ฌํ ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํด์ ์ด๋ค ์๋ฒ๊ฐ ์๋ตํ๋๋ผ๋ ์๊ด์ด ์์ด์ง๋ค.
connectionless์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ดํ ์๋ฒ๊ฐ ์๋ต์ ์๋ฃํ๋ฉด, ๋ฐ๋ก TCP / IP ์ฐ๊ฒฐ์ ๋์ด์ ํด๋น ์ปค๋ฅ์ ์ ์ ์งํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๋น์ฐ๊ฒฐ์ฑ์ผ๋ก ์ธํด ๋งค ์์ฒญ๋ง๋ค TCP / IP๋ฅผ ์๋ก ๋งบ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์๊ธฐ๋ ํ๋ค. (๋ฌผ๋ก ์ด์ ๋ํด์๋ Persistent Connection์ ํตํด์ ์ด๋ ์ ๋ ํด์ํ์ง๋ง)
์์ ํน์ง์ ์๊ฐํด๋ณด์.
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๊ตฌ๋ถํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์๋ณ๋ก ์ด๋ ํ ์์ฒญ์ ๊ตฌ๋ถํ๋ ๊ฒ ์ด๋ก ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ก๊ทธ์ธ๋ ํ๊ณ , ๊ธ๋ ์์ฑํ๊ณ ๊ทธ๋ฌ๊ณ ์๋ค. ์ฌ๊ธฐ์ '์ธ์ฆ' ๊ฐ๋ ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
์ง๊ธ๋ถํฐ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ค์ํ ์ธ์ฆ ๊ด๋ จ ์ ๋ณด๋ค์ ํจ๊ป ์ดํด๋ณด์.
๐ฑ 1. ์ธ์ฆํ๊ธฐ
The HTTP Authorization request header can be used to provide credentials that authenticate a user agent with a server, allowing access to a protected resource.
HTTP request header ์ค์ 'Authorization' ํ๋์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ๋ณธ์ธ์ ์๊ฒฉ ์ฆ๋ช ์ ์ ๊ณตํ์ฌ, ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ ์ ์๋๋ก ๋ง๋ค ๋ ์ฌ์ฉํ๋ค. ๋ง์ ์ด๋ ต์ง๋ง, ๊ด์ต์ ์ผ๋ก Authorization ํค๋์๋ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ค๋ ๊ฒ์ด๋ค.
์ธ์ฆ์ ์งํํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๊ฒ ์์ง๋ง, ๊ฐ์ฅ ๊ฐ๋จํ Basic ์ธ์ฆ ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ ค๋ณด์.
Authorization: Basic <credentials>
์ฌ๊ธฐ์ credentials ๋ถ๋ถ์๋ Base64๋ก ์ธ์ฝ๋ฉ๋ A:B ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค.
๋ค๋ง, base64๋ก ๋์ฝ๋ฉ์ด ๋ฐ๋ก ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฌ์ค ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ด์ง ์๋ ๊ฒ์ด ์ข๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ์์ธ Basic ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด, 'Basic + Base64๋ก-์ธ์ฝ๋ฉ๋(์์ด๋:๋น๋ฐ๋ฒํธ)' ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ค.
์๋ฒ์์๋ ํด๋น ์ ๋ณด๋ฅผ ๋ฐ์ ๋์ฝ๋ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด ํ์ฑํ๊ณ , ์ค์ ๋ก ๋ฑ๋ก๋ ์ ํจํ ์ฌ์ฉ์์ธ์ง ์ฒดํฌํ์ฌ 200 or 401์ ๋ด๋ ค์ค๋ค.
ํ์ง๋ง, ์ด๋ ๊ฒ ๋จ์ํ Header ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ถํ์ด ํ์ํ ํ์๊ฐ ์์ ๋ ๋งค๋ฒ ์ธ์ฆ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํธ๋ํฝ์ด ๋ง์ ์๋น์ค์์๋ ๊ต์ฅํ ๋ถ๋ด์ด ๋ ์ ์๋ค.
๐ฑ 2. ์ธ์ฆ ์ ์งํ๊ธฐ
๋งค๋ณ ์ธ์ฆํ์ง ์๊ณ , ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์งํ ์ ์์๊น?
์ด๋ฅผ ์ํด์ ๋ธ๋ผ์ฐ์ ์ ํ์ ๋น๋ ค, '๋ก์ปฌ ์คํ ๋ฆฌ์ง, ์ธ์ ์คํ ๋ฆฌ์ง, ์ฟ ํค' ๋ฑ์ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
๐ช ์ฟ ํค (Cookie)
์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋๋ ๋ง๋ฃ ๊ธฐ๊ฐ์ด ์๋, Key-value๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ ํ์ผ.
Statelessํ HTTP์์ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ฒ๋ผ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ document.cookie๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟ ํค์ ๋ํ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ์ทจ๋ํ ์ ์๊ธฐ ๋๋ฌธ์ XSS ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐ฌ XSS: ์ ์์ ์ธ ๋ชฉ์ ์ ๊ฐ์ง ์ 3์๊ฐ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ์ฌ ์๋ํ์ง ์๋ ๋ช ๋ น์ ์คํ์ํค๊ฑฐ๋ ์ธ์ ๋ฑ์ ํ์ทจํ ์ ์๋ ์ทจ์ฝ์ .
๊ทธ๋์ ๋ณดํต ์ฟ ํค๋ฅผ ์ฌ์ฉํ ๋๋ ์๋์ ๊ฐ์ด HttpOnly ์ต์ ์ ์ผ์ฃผ๋ ๊ฒ์ด ์ข๋ค.
private void addCookie(final HttpServletResponse response, final String token) {
Cookie cookie = new Cookie("USER", token);
cookie.setHttpOnly(true);
response.addCookie(cookie);
}
์์ ๊ฐ์ด httpOnly ์ต์ ์ ์ผ์ฃผ๊ฒ ๋๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ฟ ํค๋ฅผ ์กฐํํ๋ ๊ฒ ์ฐจ๋จ๋๋ค.
์ฟ ํค์๋ ํ๋์ ์ฟ ํค๋น 4kb์ ์ฉ๋ ์ ํ์ด ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ์ต์ 300๊ฐ ์ด์ ํ์ฉ๋ ์ ์๋๋ก ๊ตฌ์ฑ๋์ด์ผ ํ๋ค.
์ฟ ํค์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ๋ฐ๋ก ์์ฒญํ์ง ์์๋ ๋ธ๋ผ์ฐ์ ๊ฐ request ์์ ์๋์ผ๋ก Request Header ์ ๋ณด์ ๋์ด์ ์๋ฒ์ ์ ์ก๋๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ธ์ฆ ๊ณผ์ ๋ณด๋ค ๋น๊ต์ ๊ฐ๋จํด์ง๋ค.
๋ํ, ์ฟ ํค์๋ ์ฌ๋ฌ ์ข ๋ฅ๊ฐ ์๋๋ฐ ์ด์ ๋ํด์ ๊ฐ๋จํ๊ฒ๋ง ์ง๊ณ ๋์ด๊ฐ์.
๐ฌ Session Cookie
๋ฉ๋ชจ๋ฆฌ๋ก ์ ์ฅ๋๋ฉฐ, ๋ง๋ฃ ์๊ฐ์ด ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ ์ ์ ๊ฑฐ๋๋ ์ฟ ํค์ด๋ค.
๐ฌ Persistent Cookie
ํ์ผ๋ก ์ ์ฅ๋๋ฉฐ, Max-Age / Expires ํค๋ ์ ๋ณด๋ฅผ ํตํด ์ฅ๊ธฐ๊ฐ ์ ์ง๊ฐ ๊ฐ๋ฅํ๋ฉฐ ๋ธ๋ผ์ฐ์ ์ข ๋ฃ์ ์๊ด์์ด ์ฌ์ฉ ๊ฐ๋ฅํ ์ฟ ํค์ด๋ค.
๐ฌ Secure Cookie
HTTPS์์ ์ฌ์ฉํ๋ ์ฟ ํค. (httpOnly ์ด๊ธฐ ๋๋ฌธ์ XSS ์์ ๋ณด์ฅ)
๐ฌ Third Party Cookie
์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ ๋๋ฉ์ธ์ด ์๋, ๋ค๋ฅธ ๋๋ฉ์ธ์ ์น์ฌ์ดํธ๊ฐ ์ฌ์ฉ์์ ํ๋ ๋์คํฌ์ ์ ์ฅํ๋ ์ฟ ํค.
๋ณดํต ๊ด๊ณ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ ๋๊ฐ ๋ง๋ค.
ํ์ง๋ง, ์์ ๋งํ ๊ฒ์ฒ๋ผ ์ฟ ํค์๋ ์ฉ๋ ์ ํ์ด ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด HTML5๋ถํฐ ์ถ๊ฐ๋ ์ ์ฅ์์ธ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ธ์ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๐ ์น ์คํ ๋ฆฌ์ง
์น ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์๋ฒ๋ก ์ ์ก๋์ง ์์ผ๋ฉฐ, window๋ผ๋ ๊ฐ์ฒด ์์ ๋ค์ด์๋ค.
๋ธ๋ผ์ฐ์ , ๊ธฐ๊ธฐ๋ณ๋ก ๋ค๋ฅด์ง๋ง ๋ชจ๋ฐ์ผ์ ๊ฒฝ์ฐ 2.5mb, ๋ฐ์คํฌํ์ 5~10mb ์ ๋์ ์ฉ๋์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ฌ์ค ๋ด๋ถ์ ๋ด๋ ์ ๋ณด์ ํฌ๊ธฐ๋ ๋งค์ฐ ์๊ธฐ ๋๋ฌธ์ ์ฟ ํค์ ๋นํด ๋งค์ฐ ๋๋ํ๋ค๊ณ ํ ์ ์๋ค. ์ด๊ฒ๋ ๋ถ์กฑํ๋ค๋ฉด 50mb์ ์ฉ๋์ ๊ฐ์ง IndexedDB๋ฅผ ํ์ฉํ๊ธฐ๋ ํ๋ค.
๋ํ, ๋๋ฉ์ธ๋ณ๋ก ์ฉ๋ ์ ํ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ CSRF๋ก๋ถํฐ ์์ ํ๋ฉฐ, ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ ์ ๋ณด๊ฐ ๋์ผํ๋ค๋ฉด ๊ฐ์ ์คํ ๋ฆฌ์ง๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ค.
CSRF
: ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์์กฐ๋ ์ฌ์ดํธ์ ์ ์ํ์ฌ, ์์กฐ๋ ์ฌ์ดํธ์์ ์์กฐ๋ ์์ฒญ์ ์ ์ํ์ ๋ ๋ง์น ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ํด๋น ์์ฒญ์ ์ํํ ๊ฒ์ฒ๋ผ ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ. (์ฌ์ฉ์๊ฐ ์์ ์ ์์ง์๋ ๋ฌด๊ดํ๊ฒ ๊ณต๊ฒฉ์๊ฐ ์๋ํ ํ์๋ฅผ ํน์ ์น ์ฌ์ดํธ์ ์์ฒญํ๋ ๊ณต๊ฒฉ)
๋ํ์ ์ผ๋ก ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ธ์ ์คํ ๋ฆฌ์ง๋ก ๋๋ ์ ์๋๋ฐ, ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ์ง ์๋ ์ด์ ๊ณ์ ๋ธ๋ผ์ฐ์ ์ ๋จ์์๊ณ , ์ธ์ ์คํ ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์๋์ฐ๋ ๋ธ๋ผ์ฐ์ ์ ํญ์ ๋ซ์ ๊ฒฝ์ฐ ์ ๊ฑฐ๋๋ ๋ฐฉ๋ฒ์ด๋ค.
ํ์ง๋ง, ์ธ์ฆ์ ์ ์งํ๊ธฐ ์ํด ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ฒ ๋๋ฉด ํด์ปค๊ฐ ์ ๊ทผํ๊ธฐ๊ฐ ์ฝ๋ค.
์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์น ์คํ ๋ฆฌ์ง ๋ฐฉ์์ ๊ฒฝ์ฐ ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๋น๊ต์ ๋ณด์์ ์ทจ์ฝํ๋ค.
์คํ ๋ฆฌ์ง์ ์๋ ์ ๋ณด๋ฅผ ํ์ทจํ๊ฒ ๋๋ฉด ๊ฒฐ๊ตญ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฑ 3. ์์ ํ๊ฒ ์ธ์ฆํ๊ธฐ
์ข ๋ ์์ ํ๊ฒ ์ธ์ฆํ๊ธฐ ์ํด์, ์ฟ ํค ๋์ ์ ์ธ์ ์ ํ ๋ฒ ํ์ฉํด๋ณด์.
์ธ์ ์ ์ธ์ฆ๋ ์ฌ์ฉ์์ ์๋ณ์์ ๋๋คํ ๋ฌธ์์ด์ ๋ฐํ์ผ๋ก SessionID๋ฅผ ์์ฑํ์ฌ response header๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๋ค. ์๋ฒ ์ธก์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ์์ ํ๊ฒ ๊ด๋ฆฌ๋๋ฉฐ, ํ์ทจ๋ฅผ ๋นํ๋๋ผ๋ session ID ์ ๋ณด๋ง ๋ด๊ฒจ์๊ธฐ ๋๋ฌธ์ ์์ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๊ฐ ๊ทธ๋๋ก ๋ฐํ๋์๋ ์ฟ ํค๋ณด๋ค๋ ๋น๊ต์ ์์ ํ๋ค. (๋น๊ต์ ! ์์ ํ๋ค๋ ๊ฒ์ด ํฌ์ธํธ)
๋ํ, ์ธ์ ์ ๊ฒฝ์ฐ '๋ง๋ฃ ๊ธฐํ'์ ์ ํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ง๋ฃ ๊ธฐ๊ฐ์ด ์ง๋ ์ธ์ ์ ๋ณด์ ๊ฒฝ์ฐ ๋ฌด์๋ฏธํด์ง๋ค.
ํด๋น ์ธ์ ์ด ํ์ทจ๋์๋ค๊ณ ์๋ฒ์์ ํ๋จํ์ ๊ฒฝ์ฐ ํด๋น ์ธ์ ์ ๋ณด๋ฅผ ์ ๊ฑฐํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ์์ ์ฑ์ด ๋๋ค.
๐ฌ ์คํ๋ง์ ์ธ์ ์ ์ด๋์์ ๊ด๋ฆฌํ ๊น?
์ฌ์ค ๊ฐ์ธ์ ์ผ๋ก ์ฐพ์๋ณธ ๋ด์ฉ์ด์ด์ ์ ํํ์ง๋ ์๋ค.
๋ด๊ฐ ์๊ธฐ์ ์ธ์ ์ ํฐ์บฃ์ ์ธ์ ์ ์ฅ์์์ ์ ์ฅ๋๋ ๊ฒ์ผ๋ก ์๊ณ ์์๋๋ฐ, ์ค์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๊ถ๊ธํด์ก๋ค.
// StandardSession.java
protected ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<>();
public void setAttribute(String name, Object value, boolean notify) {
...
// Replace or add this attribute
Object unbound = attributes.put(name, value);
}
์๋ฐ ์์ผ๋ก StandardSession ํด๋์ค๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์์์ concurrentMap์ ํตํด ๊ด๋ฆฌํ๊ณ ์์์ ์๊ฒ ๋์๋ค.
ํ์ง๋ง! ์ธ์ ๋ฐฉ์ ์ญ์ ๋ฌธ์ ๊ฐ ์๋ค.
๋ง์ฝ ์๋น์ค์ ์ค์ผ์ผ์ด ์ปค์ ธ์ ์๋ฒ์ ๋ํ ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์๊ธฐ๊ณ , ๋ค์ค ์๋ฒ๋ก ๊ตฌ์ฑ๋๋ค๊ณ ์๊ฐํด๋ณด์.
๋ง์ฝ ์๋ฒ A๋ฅผ ํตํด ์ธ์ ์ ํตํด ์ธ์ฆํ๊ฒ ๋๋ค๋ฉด, ์ดํ ์์ฒญ์ ๊ณ์ ์ธ์ ์ ํตํด์ ์ธ์ฆ์ ์งํํ๊ฒ ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง, ๋ค์ ์์ฒญ์ด ๋ก๋ ๋ฐธ๋ฐ์์ ์ํด์ ์๋ฒ B์๊ฒ ์์ฒญ์ ์ ๋ฌํ๋ค๋ฉด?
์๋ฒ A๋ ํด๋น ์ธ์ ์ ๋ณด๊ฐ ์กด์ฌํ๊ณ ์๋๋ฐ, ์๋ฒ B์๋ ์ธ์ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ค์ ์์ฒญ์ ๋ฐ์์ผ ํ๋ ์ํฉ์ด ์๊ธด๋ค.
์ด๋ฅผ ์ํด์ ๋ชจ๋ ์๋ฒ์์ ์ ๊ทผํ ์ ์๋ ํ๋์ ์ธ์ ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
ํ์ง๋ง, ์ด ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๊ฐ ๋ง์์ง๋ค๋ฉด ํ๋์ ์ธ์ ์ ์ฅ์๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ฌด๋ฆฌ๊ฐ ์์ ๊ฒ์ด๋ฉฐ, ๋ง์ฝ ํด๋น ์ธ์ ์ ์ฅ์๊ฐ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋ชจ๋ ์์ฒญ์ ๋ฐ์ง ๋ชปํด ๋ ํฐ ์ฅ์ ๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
๐ฌ Sticky Session
ํน์, Sticky Session์ ํ์ฉํ ์๋ ์๋ค.
์ด๋ ํน์ ์ธ์ ์ ์์ฒญ์ ์ฒ์ ์ฒ๋ฆฌํ ์๋ฒ๋ก๋ง ์ ์ฅํ๋ ๊ฒ์ผ๋ก, ํ๋์ ์ธ์ ์ ๋ณด๊ฐ ๋ค๋ฅธ ์ธ์ ์๊ฒ ์์ฒญ๋์ง ์๋๋ก ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฆ, ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์ฒ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์๋ฒ์๊ฒ๋ก ๋ผ์ฐํ ์ ๊ณ์ ์งํํ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด์ ์ฟ ํค์๋ค๊ฐ ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ์์ผ๋ก ๋ง๋ ๋ค๊ณ ํ๋ค)
ํ์ง๋ง, Sticky Session์ ๊ฒฝ์ฐ ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์๋์น ์๊ฒ ๋์ํ ๊ฒฝ์ฐ ์ฅ์ ํธ๋ ์ด์ฑ์ด ๊ต์ฅํ ์ด๋ ค์์ง๋ฉฐ, ํน์ ์๋ฒ์๋ง ์์ฒญ์ด ๋ชฐ๋ฆด ์๋ ์๊ธฐ ๋๋ฌธ์ ํด๋น ์๋ฒ๊ฐ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฒ๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค.
๐ฌ Session Clustering
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๊ฐ ์ธ์ ๋ค์ ํ๋๋ก ๋ฌถ์ด์ ํด๋ฌ์คํฐ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด 'Session Clustering'์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด ํ๋์ ์ธ์ ์์ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋, ์ฅ์ ๊ฐ ๋ฐ์ํ ์ธ์ ์ ํด๋ฌ์คํฐ๋ก ๋ฌถ์ฌ์๋ ๋ค๋ฅธ ์ธ์ ์ผ๋ก ์ด๋๋์ด ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋น๊ต์ ๋ณต๊ตฌํ๊ธฐ๊ฐ ์ฝ๋ค.
ํ์ง๋ง, ์๋ก์ด ์๋ฒ๊ฐ ์ถ๊ฐ๋๋ค๋ฉด ๊ธฐ์กด์ ์กด์ฌํ๋ WAS์ ์๋ก์ด ์๋ฒ ์ ๋ณด๋ฅผ ์ ๋ ฅํ์ฌ ํด๋ฌ์คํฐ๋ง์ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ณต์กํ ์๋ ์๋ค๋ ์ ์ด ์กด์ฌํ๋ค.
- ํฐ์บฃ์์๋ ์ธ์ ์ ๋ณด ๋ณต์ ๋ฅผ ์ํด์ ํ๋์ ์ธ์ ์ด ๋ณ๊ฒฝ๋์์ ๋ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ ์๊ฒ ๋ณต์ ๋๋ All-to-all Session Replication ๋ฐฉ์๊ณผ Primary ์๋ฒ์ Secondary Server๋ง ์ ์ฒด๋ฅผ ๋ณต์ฌํ๊ณ ๋๋จธ์ง๋ JSessionID๋ง์ ๋ณต์ ํ์ฌ ์ฌ์ฉํ๋ Primiary-Secondary Session Replication์ด ์๋ค๊ณ ํ๋ค.
๐ฌ Session Storage ๊ตฌ์ฑํ๊ธฐ
์ฌ์ค ์์ ๊ฐ์ ๋ฌธ์ ๋๋ฌธ์ ๊ฐ์ฅ ์ฒ์์ ๋งํ '์ธ์ ์ ์ฅ์' ๋ผ๋ ๊ฐ๋ ์ ๋์ ํ ๊ฒ์ด๋ค.
์ธ์ ์ ์ํ ๋ ๋ค๋ฅธ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ ํฐ ๋ถ๋ด์ด ๋ ์๋ ์๋ค.
๋ํ, ์ธ์ฆ ์์ ์ ์ํ ์ฒ๋ฆฌ์ ์ธ๊ฐ ์์ ์ ์ํ ์ฒ๋ฆฌ์ ๊ฒฝ์ฐ ๋งค๋ฒ ์ ์ฅ์๋ฅผ ๋ค๋ ธ๋ค ์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ต์ฐ์ ์ด ๋๋ค.
๊ทธ๋์ ๋ณดํต Disk I/O ์์ ์ด ํ์์๋, ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๋ฐฉ์์ธ 'In-memory DB'๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
๋ฌผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์์กด์ ์ด๊ธฐ ๋๋ฌธ์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์๋ค๋ฉด ์ ๋ถ ์ญ์ ๋๊ฒ ์ง๋ง, ์ ์ด์ HTTP๋ statelessํ๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ๋ํ ์ ๋ณด๊ฐ ์ฌ๋ผ์ง๋๋ผ๋ ํฌ๊ฒ ๋ฌธ์ ๋์ง ์๋๋ค. (์ธ์ ์ ๋ณด๋ฅผ ํ์ ์ ์ฅํ ํ์๋ ์์ผ๋๊น)
ํนํ ๊ทธ์ค์์๋ Redis, Memcached๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ฐ ๊ฐ๋จํ๊ฒ ๋์ ๋น๊ตํ๊ณ ๊ธ์ ๋ง๋ฌด๋ฆฌํ๊ฒ ๋ค.
๋ ๋ค key-value ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉฐ NoSQL, in-memory-db๋ก ๋ถ๋ฅ๋๋ค. (์๋๋ ๋งค์ฐ ๋น ๋ฅด๋ค!)
๐ฌ Redis
๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ (List, Set... etc)๋ฅผ ์ง์ํจ / master-slave ๊ตฌ์กฐ (์ฌ๋ฌ ๊ฐ์ ๋ณต์ ๋ณธ ์์ฑ ๊ฐ๋ฅ) / ์ค๋ ์ท ์ง์ (ํน์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์ฅ์ ์ํฉ ๋ฐ์ ์ ๋ณต๊ตฌ ๊ฐ๋ฅ) / ํธ๋์ญ์ ์ง์ (ACID) / ํ์ง๋ง ์ฑ๊ธ์ค๋ ๋!
๐ฌ Memcached
๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก๋ง ์ ์ฅํ๋ฉฐ, ๋ฉํฐ์ค๋ ๋ ์ํคํ ์ฒ ์ง์
๊ธ์ด ์๊ฐ๋ณด๋ค ๊ธธ์ด์ ธ์ ๋ค์ ํฌ์คํ ์์๋ JWT, oauth ์ธ์ฆ ๋ฐฉ์์ ๋ํด์ ๋ค๋ค๋ณด๊ณ ์ ํ๋ค!
'โ๏ธ > CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์ง์ ํ ์คํธํด๋ณด๊ธฐ (0) | 2023.06.21 |
---|---|
[Web] JWT๋ฅผ ํตํ ์ธ์ฆ ๊ณผ์ ์์๋ณด๊ธฐ (0) | 2023.05.14 |
[HTTP] GET vs POST, GET์ body ๊ฐ์ ๊ฐ์ง๋ฉด ์ ๋ ๊น? (4) | 2023.04.19 |
[MSA] MicroService, SoA (0) | 2022.10.20 |