DevLog ๐Ÿ˜ถ

[Web] ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ž€? - ์ฟ ํ‚ค์™€ ์„ธ์…˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž! ๋ณธ๋ฌธ

โœ๏ธ/CS

[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

https://smjeon.dev/web/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 ์ธ์ฆ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•œ๋‹ค!

Comments