์ด๋ฒ ์๊ฐ์๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ ๋ฐฉ๋ฒ ์ค session ๊ธฐ๋ฐ ์ธ์ฆ, token ๊ธฐ๋ฐ ์ธ์ฆ(JWT)์ ๋ํด์ ์์๋ณด๊ณ ๊ฐ๊ฐ ์ฐจ์ด์ ์ด ๋ญ์ง ์ดํด๋ณด์ ๐ง
1๏ธโฃ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
๊ฐ๋
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๋ ๊ณ ์ ํ ์ธ์ ID๋ฅผ ์์ฑํ์ฌ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ํด๋น ์ธ์ ID๋ฅผ ํด๋ผ์ด์ธํธ์ ์ฟ ํค ํํ๋ก ์ ๋ฌํฉ๋๋ค.
์ดํ ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋ ์ด ์ธ์ ID๋ฅผ ํฌํจํ์ฌ ์ ์กํฉ๋๋ค.
์ ๊ทธ๋ฆผ์์ 3๋จ๊ณ๋ ์๋ฒ๊ฐ ์ธ์ ID๋ฅผ ์ฟ ํค ํํ๋ก ํด๋ผ์ด์ธํธ์ ๋ณด๋ธ๋ค. ํด๋ผ์ด์ธํธ๋ ์ด ์ธ์ ID ์ฟ ํค๋ฅผ ์ ์ฅํ๋ค.
4๋จ๊ณ๋ ๋ธ๋ผ์ฐ์ ๋ ์ดํ ๋ชจ๋ ์์ฒญ๋ง๋ค ์ ์ฅํ ์ธ์ ID ์ฟ ํค๋ฅผ ์๋์ผ๋ก ์๋ฒ์ ํฌํจํด ๋ณด๋ ๋๋ค. ์๋ฒ๋ ์ด ์ธ์ ID๋ฅผ ํตํด ์ ์ ๋ฅผ ์๋ณํ๊ณ , ์ธ์ฆ๋ ์ํ์์ ํ์ธํฉ๋๋ค.
์ดํ 5๋จ๊ณ์์ ์ ์ ์ธ์ฆ ํ, 6๋จ๊ณ์์๋ ์๋ฒ๊ฐ HTTP ์๋ต์ ๋ณด๋ผ ๋ ์ธ์ ID๋ฅผ Set-Cookie ํค๋์ ํฌํจ๋์ด ์ ๋ฌ
HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: sessionId=abc123; HttpOnly; Secure; Path=/; Max-Age=3600
โธ Set-Cookie • ์ธ์ ID๊ฐ sessionId=abc123๋ก ์ค์ ๋์ด ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋ฉ๋๋ค.
โธ HttpOnly • ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ด ์ฟ ํค์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ , ๋ณด์์ ๊ฐํํฉ๋๋ค.
โธ Secure • HTTPS ์ฐ๊ฒฐ์์๋ง ์ ์ก๋ฉ๋๋ค.
โธ Path=/ • ์ด ์ฟ ํค๊ฐ ์ด๋ ๊ฒฝ๋ก์์ ์ ํจํ์ง ์ค์ .
โธ Max-Age • ์ฟ ํค์ ์ ํจ ๊ธฐ๊ฐ์ ์ด ๋จ์๋ก ์ค์
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฅ์ ๊ณผ ๋จ์
์ฅ์ - ๋ณด์์ด ๊ฐํ๋ค
์ธ์ ๋ฐ์ดํฐ๋ ์๋ฒ์ ์ ์ฅ๋๋ฏ๋ก, ํด๋ผ์ด์ธํธ ์ธก์์ ๋ณ์กฐ๊ฐ ์ด๋ ต์ต๋๋ค.
์๋ฒ์์ ์ธ์ ์ ๋ณด๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ฏ๋ก, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋์ง ์๊ณ ์์ ํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ทธ๋์ ๋ณด์์ด ์ค์ํ ์ํ ์น์ฌ์ดํธ, ๊ด๋ฆฌ์ ํ์ด์ง์์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
๋จ์ - ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ํ๋ฏ๋ก, ์ ์ํ๋ ์ ์ ๊ฐ ๋ง์์ง์๋ก ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ด๋ฉ๋๋ค.
๋๊ท๋ชจ ํธ๋ํฝ ํ๊ฒฝ์์ ์๋ฒ ๋ถํ๊ฐ ์ฆ๊ฐํ ์ ์์ต๋๋ค.
2๏ธโฃ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ (JWT)
๊ฐ๋
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๋ ํ ํฐ(JWT)์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋ ์ด ํ ํฐ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ์ธ์ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ , ์ดํ ์์ฒญ ์๋ง๋ค ํ ํฐ์ ํค๋์ ํฌํจํ์ฌ ์๋ฒ์ ์ ์กํฉ๋๋ค.
์ ๊ทธ๋ฆผ 2๋จ๊ณ์์ ์์ฑ๋ JWT๋ฅผ ํฌํจํ HTTP ์๋ต์ ํ์
HTTP/1.1 200 OK
Content-Type: application/json
{
"token": "your.jwt.token.here"
}
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฅ์ ๊ณผ ๋จ์
์ฅ์ - ๊ด๋ฆฌ ์ฉ์ด์ฑ
ํด๋ผ์ด์ธํธ ์ธก์์ ์ฟ ํค๋ฅผ ์๋์ผ๋ก ๋ณด๋ด๋ฏ๋ก ํ ํฐ ๊ด๋ฆฌ๋ฅผ ๊ฐํธํ๊ฒ ํ ์ ์์ต๋๋ค. ex) ๋ก๊ทธ์ธ๋ ๊ธฐ๊ธฐ ๊ด๋ฆฌ
๋จ์ - ๋ณด์ ์ํ
์ฟ ํค์ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ํฌํจ๋๋ฉด *CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ์ ์ทจ์ฝํด์ง ์ ์์ต๋๋ค.
CSRF๋ ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋ ์ํ์์ ๊ณต๊ฒฉ์๊ฐ ์๋์น ์์ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก, ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ทจํ ์ํ์ด ์์ต๋๋ค.
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉ ์์
โธ RESTful API - GitHub API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ์์ฒญ. ์ฌ์ฉ์๋ ์ธ์ฆ ํ JWT๋ฅผ ํค๋์ ํฌํจํ์ฌ API์ ์ ๊ทผํฉ๋๋ค.
โธ Single Page Applications (SPAs)
โธ Mobile Applications - ์ฃผ๋ก ํญ๊ณต์ฌ ์ฑ์์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ํ, JWT๋ฅผ ์ฌ์ฉํ์ฌ ์์ฝ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ฒดํฌ์ธํ ๋ ์๋ฒ์ ์์ฒญํฉ๋๋ค.
โธ OAuth 2.0 - ๊ตฌ๊ธ ์์ด๋๋ ์นด์นด์คํก์ ๊ฐํธ ์์ ๋ก๊ทธ์ธ
๐ ์ฐจ์ด์ ์์ฝ
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ | ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ (JWT) | |
์ ์ฅ ์์น | ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ์ ์ฅ | ํด๋ผ์ด์ธํธ ๋ก์ปฌ/์ธ์ ์คํ ๋ฆฌ์ง์ ์ ์ฅ |
์ํ ๊ด๋ฆฌ | ์๋ฒ๊ฐ ์ํ๋ฅผ ์ ์ฅ | ์๋ฒ๊ฐ ์ํ๋ฅผ ์ ์ฅํ์ง ์์ |
๋ณด์ | ์ธ์ ์ ๋ณด๊ฐ ์๋ฒ์ ์์ด ๋ณด์์ฑ์ด ๋์ | ํ ํฐ์ด ํ์ทจ๋๋ฉด ์ํ |
ํ์ฅ์ฑ | ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ด ์ปค์ง | ์๋ฒ ๋ถํ๊ฐ ์ ๊ณ ํ์ฅ์ฑ ๋์ |