์ธ์ฆ์ ํ์์ฑ
์ธ์ฆ ๋ฐฉ์
์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ (์ฟ ํค & ์ธ์ )
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ (JWT ํ ํฐ)
HTTP ํ๋กํ ์ฝ์
๋น์ฐ๊ฒฐ์ฑ
,๋ฌด์ํ์ฑ
ํ๋กํ ์ฝ์ด๋ค.
-
HTTP ํ๋กํ ์ฝ์ ๋น์ฐ๊ฒฐ์ฑ(Connectionless) ํ๋กํ ์ฝ์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ request๋ฅผ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์ด์ ๋ํ response๋ฅผ ๋ณด๋ด๋ฉด ์ฐ๊ฒฐ์ด ๋์ด์ง๋ค.
-
HTTP ํ๋กํ ์ฝ์ ๋ฌด์ํ์ฑ(Stateless) ํ๋กํ ์ฝ์ด๋ค
์์ฒ๋ผ response, request๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ค, ์ํ ์ ๋ณด๋ฅผ ์ ์งํ์ง ์์ ์ฑ ํต์ ์ด ๋๋๋ค.
์ธ์ฆ์ ํ์์ฑ โ ์ฟ ํค, ์ธ์ , ํ ํฐ์ ํ์์ฑ
HTTP๋ ์๋ฒ๊ฐ ๋ค์์ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๊ณ์ ์ ์งํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ์์ ๋ญ๋น๋ฅผ ์ค์ผ์ ์์ง๋ง ๋์์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ ์ ์๋ค.
๋ง์ฝ ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ์ ํ๋๋ผ๋ ๋ค์ ์์ฒญ์ ํด๋น ํด๋ผ์ด์ธํธ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ์ง ๋ชปํ๋ค๋ฉด ๋ค์ ๋ก๊ทธ์ธํด์ผํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ๋งค๋ฒ ์์ฒญํ ๋๋ง๋ค ์๋ฒ๋ ์๋ก์ด ์ฌ์ฉ์๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ ์ธ์ฆ ์ ์ฐจ๊ฐ ์ค๋ณต๋๋ ๋ฌธ์ ๊ฐ ์๋ค.
HTTP์ ๋ฌด์ํ์ฑ์ผ๋ก ์ธํด ์ธ์ฆ์ ์ฐจ๊ฐ ์ค๋ณต๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด ๋ฌธ์ ๋ ์ฟ ํค, ์ธ์
, ํ ํฐ
์ผ๋ก ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์งํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
-
HTTP ๊ธฐ๋ณธ ์ธ์ฆ
๊ฐ์ฅ ์ ์๋ ค์ง HTTP ์ธ์ฆ ๊ท์ฝ์ผ๋ก, ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ Base64 ์ธ์ฝ๋ฉํ์ฌ Header์ ๋ด์ ์ ์กํ๋ ์ธ์ฆ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ์์ request์ ๋ณด๋ผ ๋๋ง๋ค ์ฌ์ฉ์์ ๊ณ์ ์ ๋ณด๋ฅผ Header์ ๋ด์ ์ ์กํ๋ฏ๋ก ๋ณด์์ ์ทจ์ฝํ๋ค
Base64 ์ธ์ฝ๋ฉ์ด๋
Base64๋ Binary Data๋ฅผ Text๋ก ๋ฐ๊พธ๋ Encoding(binary-to-text encoding schemes)์ ํ๋๋ก์จ Binary Data๋ฅผ Character set์ ์ํฅ์ ๋ฐ์ง ์๋ ๊ณตํต ASCII ์์ญ์ ๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ Encoding์ด๋ค. -
์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ
์๋ฒ์ ์ธ์ ๊ณผ ํด๋ผ์ด์ธํธ์ ์ฟ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ธ์ฆ ๋ฐฉ์์ด๋ค.
-
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
ํด๋ผ์ด์ธํธ์ ์ธ์ ์ํ๋ฅผ ์ ์ฅํ์ง ์๊ณ , ํ์ํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ ํ ํฐ์ ํ์ฉํ๋ ์ธ์ฆ ๋ฐฉ์์ด๋ค.
- ํ ํฐ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ง๊ณ ์๋ค๊ฐ ์๋ฒ๋ก request๋ฅผ ๋ณด๋ผ ๋, ์ธ์ฆ ํค๋์ ๋ด์ ๋ณด๋ธ๋ค. ์๋ฒ๋ ํ ํฐ์ ๊ฒ์ฆํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค. ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ์ด๋ค์ง๋ค.
์ฟ ํค๋ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ ํ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ, ๊ทธ ์ฌ์ดํธ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ์๋ฒ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ์ ์ค์น๋๋ key-value
ํํ์ ๋ฌธ์์ด์ด๋ค.
- HTTP ๊ท๊ฒฉ์ ์ํ ์ ๋ณด๋ฅผ ์ ์งํ ์ ์๋ ์ํฉ์์ ๋ฑ์ฅํ ๊ธฐ์ ์ด ๋ฐ๋ก
์ฟ ํค
์ด๋ค - ์ฟ ํค๋ HTTP1.1 ๊ท๊ฒฉ์ ํฌํจ๋์ง ์๋๋ค. ์ฆ, HTTP ๊ธฐ์ ์ด ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ HTTP์ ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
์ฟ ํค์ ์์ฑ๊ณผ ์ข ๋ฅ
์ฟ ํค์ ์์ฑ
Name | ์ฟ ํค์ ์ด๋ฆ |
---|---|
Value | ์ฟ ํค ๊ฐ |
Domain | ์ฟ ํค์ ์ ๊ทผ ๊ฐ๋ฅํ ๋๋ฉ์ธ์ ์ค์ ํ๋ ์์ฑ์ด๋ค. - domain=google.com ์ผ๋ก ๋๋ฉ์ธ์ ์ค์ ํ๋ฉด *.google,com ๊ณผ ๊ฐ์ ์๋ธ ๋๋ฉ์ธ์์ ํด๋น ์ฟ ํค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.- ๋๋ฉ์ธ์ ์ค์ ํ์ง ์๋๋ค๋ฉด ์๋ธ๋๋ฉ์ธ์์ ํด๋น ์ฟ ํค์ ์ ๊ทผํ ์ ์๋ค |
Path | ์ฟ ํค์ ์ ๊ทผํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ ์์ฑ์ด๋ค. - path=/cat ์ผ๋ก path๋ฅผ ์ค์ ํ๋ฉด /cat , /cat/1 , /cat/1/age ์ ๊ฐ์ ๊ฒฝ๋ก์์ ํด๋น ์ฟ ํค์ ์ ๊ทผํ ์ ์๋ค |
Expires/Max-Age | Expires/Max-Age๋ ์ฟ ํค๋ฅผ ์ผ๋ง๋ ์ ์งํ ๊ฒ์ธ์ง ์ค์ ํ๋ ์์ฑ์ด๋ค. - Expires/Max-Age๊ฐ ์ค์ ๋์ง ์์ ์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ซํ๋ ์ญ์ ๋๋ค. (์ด์ ๊ฐ์ ์ฟ ํค๋ฅผ ์ธ์ ์ฟ ํค ๋ผ ํ๋ค) |
HttpOnly | ํด๋ผ์ด์ธํธ์์ Javascript์ document,cookie ๋ฅผ ํ์ฉํ์ฌ ์ฟ ํค๋ฅผ ์กฐ์ํ ์ ์๋๋ก ์ ์ธํ๋ ์ค์ ์ด๋ค. - XSS (Cross-site Scripting) ๊ณต๊ฒฉ์ ๋ง๊ธฐ ์ํด ์ฌ์ฉํ๋ค. (XXS : ์น ์ฌ์ดํธ ๊ด๋ฆฌ์๊ฐ ์๋ ๋ค๋ฅธ ์ด๊ฐ ์น ํ์ด์ง์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ ์ ์๋ ์ทจ์ฝ์ ์ด๋ค) - XSS๋ ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ๊ณต๊ฒฉ์ ๊ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. |
Secure | Secure ์์ฑ์ ์ค์ ํ๋ฉด ํด๋น ์ฟ ํค๋ HTTPS ํต์ ์์๋ง ์ ๊ทผํ ์ ์๋ค |
SameSite | ์ฌ์ดํธ ์ธ๋ถ์์์ ํด๋น ์ฟ ํค์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ์ธํ๋ ์ค์ ํ๋ค. - SameSite๋ฅผ ์ ์ธํ๋ฉด ์ฟ ํค๊ฐ Cross-Site ์์ฒญ์ ์ ์ก๋์ง ์๋๋ค. - CSRF (ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์์กฐ) ๊ณต๊ฒฉ์ ๋ง๊ธฐ ์ํด ์ฌ์ฉํ๋ค. (CSRF : ์ฌ์ฉ์๊ฐ ์์ ์ ์์ง์ ๋ฌด๊ดํ๊ฒ ๊ณต๊ฒฉ์์ ์๋๋๋ก ์น ์ฌ์ดํธ์ ์์ฒญ์ ํ๊ฒํ๋ ๊ณต๊ฒฉ์ด๋ค) - CSRF๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์ ๊ณต๊ฒฉ์ ๊ฐํ๋ ๋ฐฉ์์ด๋ค. |
์ฟ ํค์ ์ข ๋ฅ
์ข ๋ฅ | ์ค๋ช |
---|---|
Session Cookie | ๋ฉ๋ชจ๋ฆฌ์๋ง ์ ์ฅ๋๋ ์ฟ ํค์ด๋ค. - ๋ธ๋ผ์ฐ์ ์ข ๋ฃ์ ์ญ์ ๋๋ค. - ์ฟ ํค์ Expires ์์ฑ์ด ์์ผ๋ฉด Session Cookie๋ก ๊ฐ์ฃผํ๋ค. |
Persistent Cookie | ์ฅ๊ธฐ๊ฐ ์ ์ง๋๋ ์ฟ ํค์ด๋ค. - ํ์ผ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์ข ๋ฃ์์๋ ์ ์ง๋๋ค. (ex) Max-Age : 1๋ ) - ์ฟ ํค์ Expires ์์ฑ์ด ์์ผ๋ฉด Persistent Cookie๋ก ๊ฐ์ฃผํ๋ค. |
Secure Cookie | HTTPS์์๋ง ์ฌ์ฉ๋๋ ์ฟ ํค์ด๋ค. - ์ฟ ํค ์ ๋ณด๊ฐ ์ํธํ๋์ด ์ ์ก๋๋ค. |
Third-Party Cookie | ๋ฐฉ๋ฌธํ ๋๋ฉ์ธ๊ณผ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์ฟ ํค์ด๋ค. - ์ฃผ๋ก ๊ด๊ณ ๋ฐฐ๋๋ฅผ ๊ด๋ฆฌํ ๋ ์ ์ ๊ฒฝ๋ก ์ถ์ ์ ์ฌ์ฉ๋๋ค. |
๋์ ๋ฐฉ์
-
์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ request ๋ณด๋ธ๋ค.
-
์๋ฒ๋ ์ํ ์ ์ง๋ฅผ ํ๋ ค๋ ๊ฐ์ ์ฟ ํค๋ก ์์ฑํ๊ณ , ์ด๋ฅผ response์ HTTP ํค๋(
Set-Cookie
)์ ํฌํจํ์ฌ ์ ์กํ๋ค.TTP/1.0 200 OK Content-type: text/html Set-Cookie: yummy_cookie=choco Set-Cookie: tasty_cookie=strawberry
-
์น ๋ธ๋ผ์ฐ์ ๋ ์ ๋ฌ๋ฐ์ ์ฟ ํค๋ฅผ ๋ฐ์ ์ ์ฅํ๊ณ , ๋ค์ request๋ฅผ ์ ์กํ ๋ HTTP ํค๋(
Cookie
)์ ๋ด์์ ์ ์กํ๋ค.GET /sample_page.html HTTP/1.1 Host: www.example.org Cookie: yummy_cookie=choco; tasty_cookie=strawberry
์ฟ ํค์ ๋ฌธ์ ์
-
์ฟ ํค์ ๋ํ ์ ๋ณด๋ฅผ ๋งค ํค๋(Http Header)์ ์ถ๊ฐํ์ฌ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ย ์๋นํ ํธ๋ํฝ์ ๋ฐ์์ํจ๋ค
-
๋ณด์์ ์ทจ์ฝํ๋ค
ํด๋ผ์ด์ธํธ์ request ํค๋์ ์ฟ ํค ๊ฐ์ ๊ทธ๋๋ก ๋ด์ ์ ์กํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ๋ ์ ์๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์๋ณ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค.
-
์ฟ ํค์ ๊ฐ์, ํฌํค๊ฐ ํ์ ๋์ด์๋ค
์ฟ ํคย ํ์ค์์ธ RFC 2109์ ๋ฐ๋ฅด๋ฉดย ์ฟ ํค๋ 300๊ฐ๊น์ง ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ต๋ย ํฌ๊ธฐ๋ 4,096๋ฐ์ดํธ(
0.004096 MB
)์ด๊ณ , ํ๋์ ํธ์คํธ๋ ๋๋ฉ์ธ์์ ์ต๋ 20๊ฐ๊น์ง ๋ง๋ค ์ ์๋ค (๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ๋ ํ์ค์๋ณด๋ค ๋ ์ ์ ๊ฐ์์ ์ฟ ํค๋ง์ ์ง์ํ๋ค) -
์น๋ธ๋ผ์ฐ์ ๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ๋ค๋ฅธ ์น๋ธ๋ผ์ฐ์ ์์ ์ ์ฅํ ์ฟ ๊ธฐ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค
์น ๋ธ๋ผ์ฐ์ ๋ง๋ค ์ฟ ํค์ ๋ํ ์ง์ ํํ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ณต์ ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค
์ฟ ํค์ ๋์
์ฟ ํค์ ๋์ : Web Storage API
Web Storage API
๋ ๊ธฐ์กด ์ฟ ํค์ ๋ฌธ์ ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํด์ค๋ค. (๊ธฐ์กด์๋ ์๋ฒ๊ฐ ๋ง๋ ์ฟ ํค๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ฅํ๋ ๋ฐฉ์์ด์๋ค)
- Web Storage๋ ์ต์ 5MB ์ด์์ ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ์๊ณ , ์ด ์ ๋ณด๋ ์๋ฒ๋ก ์ ์ก๋์ง ์๋๋ค.
- Origin ๋ง๋ค Web Storage๊ฐ ํ๋์ฉ๋ง ์กด์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋์ Origin์ ์ํ๋ ๋ชจ๋ ์น ํ์ด์ง๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ๊ฐ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
- Origin : ๋๋ฉ์ธ๊ณผ ํ๋กํ ์ฝ์ ํ์์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ณ์์ด๋ค.
- ๋๋ฉ์ธ(domain): naver.com
- ์ค๋ฆฌ์ง(origin):ย https://www.naver.com:port
- Origin : ๋๋ฉ์ธ๊ณผ ํ๋กํ ์ฝ์ ํ์์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ณ์์ด๋ค.
Web Storage API๋ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋๋ก ๋ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ค.
- sessionStorage ๊ฐ์ฒด : ํ๋์ ์ธ์ (session)๋ง์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด
- localStorage ๊ฐ์ฒด : ๋ณด๊ด ๊ธฐํ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ฐ์ฒด
์ธ์
์ ์ฟ ํค์ ๋ฌธ์ ์ ์ผ๋ก ์ธํ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ธฐ์ ๋ก, ์ผ์ ์๊ฐ๋์ ๊ฐ์ ์น ๋ธ๋ผ์ฐ์ ๋ก ๋ถํฐ ๋ค์ด์ค๋ ์ผ๋ จ์ ์๊ตฌ๋ฅผ ํ๋์ ์ํ
๋ก ๋ณด๊ณ ๊ทธ ์ํ๋ฅผ ์ผ์ ํ๊ฒ ์ ์ง์ํจ๋ค.
ํ๋์ ์ํ = ์ฌ์ฉ์์ ๋ํ ๊ณ ์ ํ ์๋ณ๊ฐ = SessionId
- ์๋ฒ๋ SessionId๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋๋ Redis์ ๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค.
- ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํ๋์จ์ด์ ๋น์ฉ์ด ๊ฐ์ํ์ฌ ์ค์ํ ๋ฐ์ดํฐ๋ ์๋ฒ์ ์ ์ฅํ๋ ์์ผ๋ก ๋ฐ์ ํ์๋ค.
ํ์ฉ ๋ฐฉ์
-
์๋ฒ์ ์ ์ฅ๋ ์ธ์ ์ ๊ตฌ๋ถํ๊ธฐ ์ํ SessionId๊ฐ์ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฟ ํค๋ฅผ ์ฌ์ฉ๋๋ค.
-
์ ํฌ๋ธ, ๊ตฌ๊ธ์์ ๋ก๊ทธ์ธํ์ง ์์๋ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ๋์์์ด๋ ๊ฒ์ ๊ธฐ๋ก์ ์ฟ ํค์ ์ ์ฅํด๋๊ณ , ํด๋น ์ฟ ํค๋ฅผ ๋ฐํ์ผ๋ก ๊ฒ์ ์ต์ ํ์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
-
์ผํ๋ชฐ ์ฌ์ดํธ์์๋ ์ฌ์ฉ์์ ์ผํ ๋ํฅ์ ์ฟ ํค์ ์ ์ฅํ์ฌ, ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ์ ์ถ์ฒํ๋ค.
์ฟ ํค vs ์ธ์ ๋น๊ต
Cookie | Session | |
---|---|---|
์ ์ฅ์์น | ํด๋ผ์ด์ธํธ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋๋ ํ๋๋์คํฌ์ ์ ์ฅ | ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ |
์ ์ฅํ์ | Text | Object |
๋ง๋ฃ์์ | ์ฟ ํค ์ ์ฅ์ expires ์์ฑ์ผ๋ก ์ค์ (์ค์ ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์) | ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์์ํ๊ฑฐ๋, ์ค์ ์๊ฐ๋์ ๋ฐ์์ด ์์ผ๋ฉด ๋ฌดํจํ ๋๊ธฐ ๋๋ฌธ์ ์ ํํ ์์ ์ ์ ์์ |
๋ฆฌ์์ค | ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๊ณ ํด๋ผ์ด์ธํธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ฒ ์์ ์ฌ์ฉํ์ง ์์ | ์ธ์ ์ ์๋ฒ์ ์ ์ฅ๋๊ณ , ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ก๋ฉ ๋๊ธฐ ๋๋ฌธ์ ์ธ์ ์ด ์๊ธธ ๋๋ง๋ค ๋ฆฌ์์ค๋ฅผ ์ฐจ์งํจ |
์ฉ๋์ ํ | ํด๋ผ์ด์ธํธ๋ ๋ชจ๋ฅด๊ฒ ์ ์๋๋ ์ฌ์ดํธ์ ์ํ์ฌ ์ค์ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฟ ํค๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฑธ ๋ง๊ณ ์ ํ ๋๋ฉ์ธ๋น 20๊ฐ, ํ๋์ ์ฟ ํค ๋น 4KB๋ก ์ ํํด ๋ | ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ๋ฉด ์๋ฒ์ ์ํด ์์ฑ๋๋ฏ๋ก ๊ฐ์๋ ์ฉ๋ ์ ํ ์์ |
์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ ๊ณผ์
- ํด๋ผ์ด์ธํธ๋ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์๋ฒ์๊ฒ ์ ๋ฌํ๋ค
- ์๋ฒ๋
DB
๋ฅผ ํตํด ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ฒ์ฆํ๊ณ , ์ ํํ๋ค๋ฉด ์ฌ์ฉ์๋ฅผ ์๋ณํ ๊ณ ์ SessionID๋ฅผ ์์ฑํ๋ค. ์ดํ HTTP response ํค๋์Set-Cookie
ํ๋์ SessionID๋ฅผ ๋ด์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค - ํด๋ผ์ด์ธํธ๋ ์ ๋ฌ๋ฐ์ SessionID๋ฅผ ์ฟ ํค์ ์ ์ฅํ๊ณ , ์์ฒญ์ HTTP request ํค๋์
Cookie
ํ๋์ ์ฟ ํค๋ฅผ ๋ด์ ์๋ฒ์ ์ ๋ฌํ๋ค. - ์๋ฒ๋ ์ฟ ํค๋ฅผ ๋ฐ์
์ธ์ ์ ์ฅ์
๋ฅผ ํตํด SessionID์ ์ ํจ์ฑ์ ํ์ธํ ์ดํ, ์์ฒญ์ ์ฒ๋ฆฌํ๋ค. (์ธ์ ์ ์ฅ์๋ WAS์ ์ธ์ , RDB, In-memory DB๊ฐ ๋ ์ ์๋ค)
์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ๋ฌธ์ ์
-
์๋ฒ ๋ถํ ๋ฌธ์
๋ง์ฝ ์ฌ์ฉ์ ์๊ฐ ๋ง์์ง๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์ธ์ ์ ๋ณด๊ฐ ๋ง์์ง๋. ์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋์คํฌ ๋ถํ(disk I/O)๋ฅผ ์ผ์ผํจ๋ค.
-
ํ์ฅ์ฑ ๋ฌธ์
๋ ๋ง์ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์น ์๋ฒ๋ฅผ ์ฆ์คํ ๊ฒฝ์ฐ, ์๋ก์ด ์น ์๋ฒ์ ๊ธฐ์กด์ ์ธ์ ์ ๋ณด๋ฅผ ์ฎ๊ฒจ์ผ ํ๊ธฐ ๋๋ฌธ์ Scaling Out์ด ์ด๋ ค์์ง๋ค.
-
CORS(Cross-origin resource sharing) ๋ฐฉ์
์น ๋ธ๋ผ์ฐ์ ์์ ์ธ์ ๊ด๋ฆฌ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ์ฟ ํค๋ ๋จ์ผ ๋๋ฉ์ธ/์๋ธ ๋๋ฉ์ธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ๊ธฐ ๋๋ฌธ์
Cross-Origin
์์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด์ฒ๋ผ ์ฟ ํค๋ฅผ ์ฌ๋ฌ ๋๋ฉ์ธ์์ ์ฌ์ฉํ๊ธฐ ๋ฒ๊ฑฐ๋กญ๋ค๋ ์ ์์ ์ฟ ํค, ์ธ์ ์ ์ด์ฉํ ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค.cross-origin์ด๋
cross-origin์ด๋ ๋ค์ ์ค ํ ๊ฐ์ง๋ผ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- ํ๋กํ ์ฝ - http์ https๋ ํ๋กํ ์ฝ์ด ๋ค๋ฅด๋ค.
- ๋๋ฉ์ธ - domain.com๊ณผ other-domain.com์ ๋ค๋ฅด๋ค.
- ํฌํธ ๋ฒํธ - 8080ํฌํธ์ 3000ํฌํธ๋ ๋ค๋ฅด๋ค.
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ์ธ์ฆ ๋ฐ์ ์ฌ์ฉ์๋ค์๊ฒ ํ ํฐ์ ๋ฐ๊ธํ๊ณ , ์๋ฒ์ ์์ฒญํ ๋๋ง๋ค ํค๋์ ํ ํฐ์ ๋ด์ ๋ณด๋ด๋๋กํ์ฌ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋ค.
- ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ์ง ์๊ณ , ํด๋ผ์ด์ธํธ ์ธก์์ ๋ค์ด์ค๋ ์์ฒญ๋ง์ผ๋ก ์ธ์ฆ์ฒ๋ฆฌํ๋ค.
์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
๊ณผ ๋ฌ๋ฆฌ ์ํ ์ ๋ณด๋ฅผ ์ ์งํ์ง ์์ผ๋ฏ๋ก stateless
ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๊ณผ์
- ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์๋ฒ์๊ฒ ์ ๋ฌํ๋ค.
- ์๋ฒ๋ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ฒ์ฆํ๊ณ , ์ ํํ๋ค๋ฉด ์ฌ์ฉ์ ์๋ณ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Token์ ๋ฐ๊ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ ๋ฌ๋ฐ์ Token์ ์ฟ ํค๋ localStorage, sessionStorage ๋ฑ์ ์ ์ฅํ๊ณ , ์ดํ ์์ฒญ์์ Token์ ๋ด์ ์ ๋ฌํ๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ Token์ ๊ฒ์ฆํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ์ด์
-
Stateless(๋ฌด์ํ์ฑ) & ํ์ฅ์ฑ
ํ ํฐ์ ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ ์ธก์์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ Statelessํ๋ฉฐ, ์๋ฒ ํ์ฅ์ ์ธ์ ์ ๋ณด๋ก ์ธํ Scaling Out์ ์ ์ฝ์ด ์๋ค.
-
์ฌ๋ฌ ํ๋ซํผ ๋ฐ ๋๋ฉ์ธ์์ ์ฌ์ฉ๊ฐ๋ฅ
โ CORS ๋ฌธ์ ํด๊ฒฐ๋๋ฐ์ด์ค์ ์ข ๋ฅ ๋ฐ ๋๋ฉ์ธ๊ณผ ์๊ด์์ด ํ ํฐ ๊ธฐ๋ฐ์ ์ธ์ฆ์ ํ ์ ์๋ค.
- ์ฃผ๋ก JSON ํฌ๋งท์ JWT ํ ํฐ์ ์ฌ์ฉํ๋ค.
JWT(JSON Web Token)
JSON ํฌ๋งท์ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ Claim ๊ธฐ๋ฐ์ Web Token์ผ๋ก ๋ชจ๋ฐ์ผ์ด๋ ์น์ ์ฌ์ฉ์ ์ธ์ฆ์ ์ํด ์ฌ์ฉํ๋ ์ํธํ ํ ํฐ์ด๋ค.
- JWT๋ URL์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉ๋ ์ ์๋๋ก Base64url ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋ฉฐ
ํค๋
+๋ด์ฉ
+์๋ช
์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค. key=value
ํ์์ผ๋ก ์ด๋ฃจ์ด์ง ํ ์์ ์ ๋ณด๋ฅผ Claim์ด๋ผ๊ณ ์นญํ๋ค.
JWT ์ด์ ์ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์
์ธ์ฆํ์ | ์ค๋ช |
---|---|
Basic | ์ฌ์ฉ์ ์์ด๋์ ์ํธ๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ ๊ฐ์ ํ ๊ทผ์ผ๋ก ์ฌ์ฉํ๋ค.(RFC 7617) |
Bearer | JWT ํน์ OAuth์ ๋ํ ํ ํฐ์ ์ฌ์ฉํ๋ค. (RFC 6750) |
Digest | ์๋ฒ์์ ๋์ ๋ฐ์ดํฐ ๋ฌธ์์ด์ ํด๋ผ์ด์ธํธ์ ๋ณด๋ธ๋ค. ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ ๋ณด์ nonce๋ฅผ ํฌํจํ๋ ํด์๊ฐ์ ์ฌ์ฉํ์ฌ ์๋ตํ๋ค (RFC 7616) |
HOBA | ์ ์ ์๋ช ๊ธฐ๋ฐ ์ธ์ฆ (RFC 7486) |
Mutual | ์ํธ๋ฅผ ์ด์ฉํ ํด๋ผ์ด์ธํธ-์๋ฒ ์ํธ ์ธ์ฆ (draft-ietf-httpauth-mutual) |
AWS4-HMAC-SHA256 | AWS ์ ์ ์๋ช ๊ธฐ๋ฐ ์ธ์ฆ |
JWT ๊ตฌ์ฑ
curl http://127.0.0.1:8000/toktokhan/ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
header = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
payload = eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
signature = SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
ํค๋
headerJWT ํ ํฐ์ ํ์ ๊ณผ ์ฌ์ฉ๋๋ ํด์ ์๊ณ ๋ฆฌ์ฆ(HMAC SHA256 ๋๋ RSA) ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ค.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
๋ฅผ ๋์ฝ๋ฉํ๋ฉด{ "typ": "JWT", "alg": "HS256" }
-
๋ด์ฉ
payloadํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์๋ค.
- ์ฝ์๋ Claim์ผ๋ก๋ iss(๋ฐ๊ธ์), sub(ํ ํฐ๋ช ), aud(๋์์), exp(๋ง๋ฃ์ผ์), nbf(ํ์ฑ์ผ์), iat(๋ฐ๊ธ์ผ์), jti(๊ณ ์ ์๋ณ์) ๋ฑ์ด ์ ํ์ ์ผ๋ก ํฌํจ ๋ ์ ์๋ค. (๋ชจ๋ ์ผ์ ์ ๋ณด๋ NumericDate ํํ์ด๋ค)
- JWT๋ฅผ ๋์ฝ๋ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณด์์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ payload์ ๋ด์์๋ ์๋๋ค
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
๋ฅผ ๋์ฝ๋ฉํ๋ฉด{ "sub": "1234567890", // ๋ฑ๋ก๋ ํ๋ ์ "name": "John Doe", // ๋น๊ณต๊ฐ ํ๋ ์ "iat": 1516239022 // ๋ฑ๋ก๋ ํ๋ ์ }
-
์๋ช
signature์๋ช ์ header์ payload๋ฅผ ๋ํ ๋ค secret key๋ก ํด์ฑํ์ฌ ์์ฑํ๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฌํ ํ ํฐ์ ์๋ช ์ผ๋ก ํ ํฐ ์๋ณ์กฐ๋ฅผ ํ์ธํ๋ค. ๋ง์ฝ ํค๋ ๋๋ ํ์ด๋ก๋ ์ ๋ณด๊ฐ ํด๋ผ์ด์ธํธ์ ์ํด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์๋ช ์ด ๋ฌดํจํ๋๋ค.
- ์๋ช ์ ์๋ฒ์ธก์์ ๊ด๋ฆฌํ๋ secret key๋ก๋ง ๋ณตํธํํ ์ ์๋ค.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
๋ฅผ ๋์ฝ๋ฉํ๋ฉดHMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret )
JWT์ ์ฅ๋จ์
์ฅ์ | ๋จ์ |
---|---|
1. Header์ Payload๋ฅผ ๊ฐ์ง๊ณ Signature๋ฅผ ์์ฑํ๋ฏ๋ก ๋ฐ์ดํฐ ์๋ณ์กฐ๋ฅผ ๋ง์ ์ ์๋ค. | 1. ์ฟ ํค/์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ JWT๋ ํ ํฐ์ ๊ธธ์ด๊ฐ ๊ธธ์ด, ์ธ์ฆ ์์ฒญ์ด ๋ง์์ง์๋ก ๋คํธ์ํฌ ๋ถํ๊ฐ ์ฌํด์ง๋ค. |
2. ์ธ์ฆ ์ ๋ณด์ ๋ํ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์์๋ค. | 2. Payload ์์ฒด๋ ์ํธํ ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ค์ํ ์ ๋ณด๋ ๋ด์ ์ ์๋ค. |
3. JWT๋ ํ ํฐ์ ๋ํ ๊ธฐ๋ณธ์ ๋ณด์ ์ ๋ฌํ ์ ๋ณด ๋ฐ ํ ํฐ์ด ๊ฒ์ฆ๋ฌ์์ ์ฆ๋ช ํ๋ ์๋ช ๋ฑ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ์ง๋๊ณ ์๋ค. | 3. ํ ํฐ์ ํ๋ฒ ๋ฐ๊ธ ๋๋ฉด ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋ ๋ ๊ณ์ ์ฌ์ฉ๋์ด ํ์ทจ ๋นํ๊ฒ ๋๋ฉด ๋์ฒํ๊ธฐ ํ๋ค๋ค. |
JWT์ ๋ณด์ ์ ๋ต
-
์งง์ ๋ง๋ฃ๊ธฐํ ์ค์
ํ ํฐ์ ๋ง๋ฃ์๊ฐ์ ์งง๊ฒ ์ค์ ํ์ฌ ํ์ทจ๋๋๋ผ๋ ํผํด๋ฅผ ์ต์ํํ ์ ์๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์์ฃผ ํด์ผํ๋ค๋ ๋ถํธํจ์ด ์กด์ฌํ๋ค.
-
Refresh Token
ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋ฒ๋ Access Token๊ณผ ํจ๊ป ๊ธด ๋ง๋ฃ ๊ธฐ๊ฐ์ ๊ฐ์ง Refresh Token์ ๋ฐ๊ธํ๋ ์ ๋ต์ ์ทจํ๋ค.
- ์ดํ Access Token์ด ๋ง๋ฃ๋์์ ๋, Refresh Token์ ์ฌ์ฉํ์ฌ Access Token์ ์ฌ๋ฐ๊ธ์ ์์ฒญํ๋ค.
- ์๋ฒ๋ DB์ ์ ์ฅ๋ Refresh Token๊ณผ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ Refresh Token์ ๋น๊ตํ์ฌ ์ ํจํ ๊ฒฝ์ฐ ์๋ก์ด Access Token์ ๋ฐ๊ธํด์ค๋ค.
Refresh Token์ ํ์ฉํ๋ฉด Access Token์ ๋ง๋ฃ ๊ธฐํ์ ์งง๊ฒ ์ค์ ํ๋ฉด์, ์ฌ์ฉ์๊ฐ ์์ฃผ ๋ก๊ทธ์ธ ํ ํ์๊ฐ ์๋ค. ๋ํ ์๋ฒ๊ฐ ๊ฐ์ ๋ก Refresh Token์ ๋ง๋ฃ์ํฌ ์ ์๋ค.
ํ์ง๋ง Refresh Token์ ์๋ฒ์ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ Statelessํ ์๋ฒ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฒํ๋ JWT์ ์ฅ์ ์ ์๋ฒฝํ๊ฒ ๋๋ฆด ์ ์๋ค.
์๋ฒ ์ธ์ฆ. ์ฟ ํค(Cookie), ์ธ์ (Session), ํ ํฐ(JWT)
[HTTP] HTTP ์ฟ ํค๋(COOKIE)? ์ฟ ํค ๋ฑ์ฅ ๋ฐฐ๊ฒฝ ๊ทธ๋ฆฌ๊ณ ์ฟ ํค์ ์ธ์ ์ ์ฐจ์ด์ .
์ฟ ํค,์ธ์ ,JWT, mozilla, ์ฟ ํค(Cookie) ๊ทธ๋ฆฌ๊ณ ์ธ์ (Session)
์ฟ ํค ์์ฑ, ์ฟ ํค์ ๋จ์
์ธ์ฆ ๋ฐฉ์ : Cookie & Session vs JWT
์ฌ์ฉ์ ์ธ์ฆ ๋ฐฉ์์ ์ข ๋ฅ๋ฅผ ๋งํด๋ณด์ธ์
์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋ํด ์ค๋ช ํด๋ณด์ธ์
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋ํด ์ค๋ช ํด๋ณด์ธ์
์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋จ์ ๊ณผ JWT๋ฅผ ์ด์ฉํ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฅ๋จ์ ์ ์ค๋ช ํด๋ณด์ธ์
JWT๋ฅผ ์ด์ฉํ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์์ Refresh Token์ ์ฉ๋๊ฐ ๋ฌด์์ธ๊ฐ์?