- ์ธ์ฆ(Authentication): ๋ง ๊ทธ๋๋ก ์ธ์ฆ == ๋ก๊ทธ์ธ์ด๋ค. ์ ๋ฌ๋ฐ์ ID ๋ฐ Password์ ์ผ์นํ๋ ์ ์ ์ ๋ณด๋ฅผ ์ฐพ๊ณ , ์ผ์นํ๋ค๋ฉด ์ธ์ฆ์ด ๋๋ ๊ฒ!!!
- ์ธ๊ฐ(Authorization): ๋ก๊ทธ์ธ์ ํ์ ๋, ๋ฐ์๋ SessionID or JWT๋ฅผ ์ด์ฉํด์ ์์ฒญ์๋ง๋ค ์ด๋ฅผ ํจ๊ป ์ค์ด๋ณด๋ด๊ณ , ๋ด๊ฐ ๋ก๊ทธ์ธ๋์ด์๋ ์ํ๋ผ๋ ๊ฒ์ ์๋ฆฌ๋ ๊ฒ. ์ฆ == ๋ก๊ทธ์ธ์ ์ ์ง์ํค๋ ๊ฒ. ๊ถํ์ ์ ์ง์์ผ์ฃผ๋ ๊ฒ์.
- ์ธ์ ๊ธฐ๋ฐ์ธ์ฆ์ ์๋ฒ(ํน์ DB)์ ์ ์ ์ ๋ณด๋ฅผ ๋ด๋ ์ธ์ฆ ๋ฐฉ์์ด๋ค.
- ์๋ฒ์์๋ ์ ์ ๊ฐ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์์ฒญํ ๋๋ง๋ค ์ ์ ๋ฅผ ํ์ธํ๊ธฐ์ํด ๋ฐ์ ์ธ์ ๊ฐ์ด ์๊ธฐ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ธ์ ๊ฐ๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ค.
- SessionID๋ ์ฟ ํค์ ํจ๊ป ์ค๋ ค ์ ์ ์๊ฒ ๋ณด๋ด์ง๋ ๊ฑฐ๊ณ , ์ ์ ๋ ์ฟ ํค์ SessionID๋ฅผ ์ค์ด์ ์๋ฒ์๋ณด๋ด๊ณ , ์๋ฒ๋ ๋ฐ์ SessionID์ ์ผ์นํ ๊ฐ์ ์ธ์ ์ ์ฅ์์์ ์ฐพ๋ ๊ฒ์.
- Native App(iOS, Android)์๋ ์ฟ ํค(Cookie)๊ฐ ์์.(?)
- ๋ณด์์ ์ผ๋ก๋ Token๋ณด๋ค Session์ด ์ข๋ค.
- Token์ ๊ทธ๋ฅ ํ์ทจํ๊ณ ๋์ฝ๋ฉํ๋ฉด ๊ทธ ์์ ๋ด์ฉ์ ๋๊ตฌ๋ ๋ง๋จน์ผ๋ฉด ํ์ณ๋ณผ ์ ์๊ธฐ ๋๋ฌธ!!!๋ํ ๊ทธ Token์ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค๊ฐ Request๋ฅผ ์ ์ฉํ ์๋ ์๊ณ !!!
- ๋ํ์ ์ผ๋ก JWT(JSON Web Token)์ด ์๋ค.
- ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณด๊ดํ๋ ๋ฐฉ๋ฒ.
- ํ ํฐ์ ์ ์ ์ ๋ณด๋ฅผ ๊ทธ ์์ฒด์ ๋ด์ ์ ์๊ณ , ํด๋ผ์ด์ธํธ ์์์ ๋ก์ปฌ ์ ์ฅ์์ ๋ ํ๋ฒ ๋ ์์ ํ๊ฒ ๋ณด๊ดํ ์ ์๋ค. (์ํธํ์๋์๋ค๋ฉด XSS, CSRF๊ณต๊ฒฉ์ ๋ ธ์ถ ์ํ์์.)
- ํ์ ์ธ์ฆ: JWT๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํํ ์๋๋ฆฌ์ค. ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก ๋งค ์์ฒญ ์ ๋ง๋ค JWT๋ฅผ ํค๋์ ํฌํจํ์ฌ ์ ๋ฌํจ. ์์ฒญ์ด ์ค๋ฉด ์๋ฒ๋ ํด๋น ํ ํฐ์ด ์ ํจํ๊ณ ์ธ์ฆ๋๋์ง ๊ฒ์ฆํ๊ณ , ์ ์ ๊ฐ ์์ฒญํ ์์ ์ ๊ถํ์ด ์๋์ง ํ์ธํ์ฌ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
์๋ฒ์ธก์์ ์ ์ ์ ์ธ์ ์ ์ ์งํ ํ์๊ฐ ์์ต๋๋ค. ์ฆ ์ ์ ๊ฐ ๋ก๊ทธ์ธ๋์ด์๋์ง ์๋์ด์๋์ง ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๊ณ , ์ ์ ๊ฐ ์์ฒญํ์ ๋ ํ ํฐ๋ง ํ์ธํ๋ฉด๋๋, ์ธ์ ๊ด๋ฆฌ๊ฐ ํ์์์ด์ ์๋ฒ ์์์ ๋ง์ด ์๋ ์ ์์ฃ . ๋ก๊ทธ์์๋๋ฉด ํ ํฐ์ด ์๋ ์ํฉ์ผ ํ ๋ ๊ฑฐ์ ๋ฃ์ด์ฃผ๋ฉด๋๊ณต.- ์ ๋ณด๊ต๋ฅ: JWT๋ ๋ ๊ฐ์ฒด ์ฌ์ด์์ ์์ ์ฑ์๊ฒ ์ ๋ณด๋ฅผ ๊ตํํ๊ธฐ ์ข์ ๋ฐฉ๋ฒ. ์ ๋ณด๊ฐ sign์ด ๋์ด์๊ธฐ ๋๋ฌธ์ ์ ๋ณด๋ฅผ ๋ณด๋ธ์ด๊ฐ ๋ฐ๋์ง ์์๋์ง, ๋ ์ ๋ณด๊ฐ ๋์ค์ ์กฐ์๋์ง๋ ์์๋์ง ๊ฒ์ฆํ ์ ์์ต๋๋ค.
โผ๏ธ ์ ๋ณด์กฐ์์ ๋ชปํ์ง๋ง, ์๋ ๊ทธ๋๋ก ํ์ทจํด์ ์ ์ฉ์ ๊ฐ๋ฅ... ํ
Q. ๊ทธ๋ฌ๋ฉด access Token๋ง ์์ผ๋ฉด ๋๋ ๊ฒ ์๋๊ฐ์?
- ๋ง์ผ access token์ ํ์ทจ๋นํ๋ค๋ฉด? ์ด ์ ์์ ์ธ ์ ์ ๋ ์๊ธฐ๊ฐ ๊ทธ ์ ์ ์ธ ๊ฒ์ฒ๋ผ ์๋ฒ์ ์ฌ๋ฌ ์์ฒญ์ ๋ณด๋ผ ์ ์๊ณ , ๋ ๊ด๋ จ์ด๋ผ๋ฉด ๋ ํฐ ๋ฌธ์ ๊ฐ ๋๋ค. ๊ทธ๋ ๊ธฐ์ access Token์ ๋น๊ต์ ์งง์ ์ ํจ๊ธฐ๊ฐ์ ๊ฐ์ง๋ค. ํ์ทจํ๋๋ผ๋ ์ค๋ ์ฌ์ฉ๋ชปํ๋๋ก! ๋ง๋ฃ๋๋ค๋ฉด refresh token์ ์ฌ์ฉํ์ฌ ์๋ก์ด access Token์ ๋ฐ๊ธ๋ฐ๋๋ค.
aaaaaa.bbbbbb.cccccc
a - header, b - ๋ด์ฉ(payload), c - ์๋ช (signature)
{
"alg": "HS256", //ํด์ฑ ์๊ณ ๋ฆฌ์ฆ ์ง์ ; ํด์ฑ - ์๋ณธ์ ์์๋ณผ ์ ์๋ ๋ํดํ ๋ฌธ์์ด๋ก ์ ์ํ๋ ๊ณผ์ . ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ณดํต HMAC SHA256 ํน์ RSA๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
"typ": "JWT" //ํ ํฐ์ ํ์
์ ์ง์ .
}
{
"sub": "someInformation",
"name": "Tamna",
"iat": 151623391
}
1) JSON์ํ
{
"typ": "JWT",
"alg": "HS256"
}
2) ๊ณต๋ฐฑ/์ํฐ ์ฌ๋ผ์ง.
{"alg":"HS256","typ":"JWT"}
3) ์ธ์ฝ๋ฉ ์๋ฃ.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
HMACSHA256( //header์์ ์ง์ ํ๋ algorithm๋ฐฉ์์ผ๋ก!
base64UrlEncode(header) + "." +
base64UrlEncode(payload), //base64 ์ธ์ฝ๋ฉํ ํค๋, ๋ด์ฉ์ ๋ฌถ์๋ค์,
secret) //์ฃผ์ด์ง ๋น๋ฐํค๋ก ํด์ฑ์คํ!
1) ํด์ฑ ์ . (header + "." + body)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2ZWxvcGVydC5jb20iLCJleHAiOiIxNDg1MjcwMDAwMDAwIiwiaHR0cHM6Ly92ZWxvcGVydC5jb20vand0X2NsYWltcy9pc19hZG1pbiI6dHJ1ZSwidXNlcklkIjoiMTEwMjgzNzM3MjcxMDIiLCJ1c2VybmFtZSI6InZlbG9wZXJ0In0
2) ํด์ฑํ๊ณ ๋ค์ ์ธ์ฝ๋ฉํ๋ฉด,
WE5fMufM0NDSVGJ8cAolXGkyB5RmYwCto1pQwDIqo2w
๊นฐ๊ป!
JWTํ ์คํธ์ฉ ์ฌ์ดํธ!!! URL: https://jwt.io
- Server๋ JWT์ Signatureํํธ๋ฅผ ๋ง๋ค ๋, Secret Key๋ฅผ ๋ฃ์ด ์ฃผ์ด์ง ์๊ณ ๋ฆฌ์ฆ์ ํตํด ํด์ฑํ๋ค๊ณ ๋ง์๋๋ ธ๋๋ฐ์.
- Header๋ฅผ ์ธ์ฝ๋ฉํด์ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด์ฑ๋ ๊ฒ์ธ์ง ์ 3์๊ฐ ์์๋๋ค๊ณ ํด๋, ์ด ์๊ณ ๋ฆฌ์ฆ์ ํด๋ ํ๋ ค๋ฉด "๋น๋ฐํค"๋ฅผ ๋ฃ๊ณ โผ๏ธ ํด๋ ์ ํด์ผํฉ๋๋ค.
- ๊ทธ๋ ๊ธฐ์ ๋น์ฐํ ๋น๋ฐํค๋ฅผ ๋ชจ๋ฅธ๋ค๋ฉด ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ธ์ง ์๋ค๊ณ ํด๋, ์ด Signatureํํธ๋ฅผ ์ด์ด๋ณผ ์ ์๋ ๊ฒ์ด์ฃ !!!
- ์ด์ด๋ณผ ์ ์์ผ๋ ์์ฐ์ค๋ฝ๊ฒ Signatureํํธ๋ ์กฐ์์ด ๋ถ๊ฐ๋ฅํด์, ์ฒ์ Server๋ฅผ ํตํด ๋ฐ์๋ ๋ฌธ์์ด ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
- Server๋ Client์๊ฒ์ Token์ ๋ฐ์ผ๋ฉด, ๋ฐ์ Header, Payload๋ถ๋ถ์ ์์ ๋ง์ด ์์ ํ Secret Key๋ฅผ ์ด์ฉํด ์๋กญ๊ฒ Signatureํํธ๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ ํ์ ์์ฒญ ์ ์ ๋ฌ๋ฐ์๋ Signatureํํธ์ ๋ฐฉ๊ธ ์์ ์ด ์์ฑํ Signature๋ฅผ ๋น๊ตํฉ๋๋ค. ๋ง์ฝ ์ด ๊ฐ์ด ๋ถ์ผ์นํ๋ค๋ฉด, ๊ทธ๊ฒ์ Header ํน์ Payload ์ค ์ผ๋ถ๊ฐ ์๋ณ์กฐ๋์๋ค๋ผ๋ ๊ฒ์ด์ฃ . ์ด๋ด ๊ฒฝ์ฐ Server๋ Client์ ๋ํ ์ธ๊ฐ(Authorization)๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค.โผ๏ธ
- Gmail ์ธ์ฆ์๋ฒ์ ๋ก๊ทธ์ธ์ ๋ณด(์์ด๋, ๋น๋ฐ๋ฒํธ)๋ฅผ ์ ๊ณตํ๋ค.
- ์ฑ๊ณต์ ์ผ๋ก ์ธ์ฆ ์ JWT๋ฅผ ๋ฐ๊ธ๋ฐ๋๋ค.
- A์ฑ์ JWT๋ฅผ ์ฌ์ฉํด ํด๋น ์ ์ ์ Gmail์ด๋ฉ์ผ์ ์ฝ๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ค.
JWT์ ๊ฒฝ์ฐ๋ ํ ํฐ์ ๋ฐ์์ ์๋ช
์ผ๋ก ์ ํจํ ํ ํฐ์ธ์ง ๊ฒ์ฆ์ ํ ๋ค์ ์ ํจํ๋ค๊ณ ํ๋จํ๋ฉด ํด๋ ์์
์ ๋์ฝ๋ฉํด์ ํ ํฐ์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ์ด์ด๋ณธ๋ค. ์์์ ๋ณด์๋ฏ์ด ํด๋ ์์
์ JSON์ ๋ง๋ฃ์๊ฐ ๋ฑ์ด ๋ด๊ฒจ์์ผ๋ฏ๋ก ํ ํฐ์ด ์ฌ์ฉ๊ฐ๋ฅํ์ง ๊ฒ์ฌ๋ฅผ ํ๊ณ ์ด์์ด ์์ผ๋ฉด ๋ฐ๋ก ์ฌ์ฉํ๋ค. ํ ํฐ์ ์ฌ์ฉ์ ์์ด๋ ๋ฑ์ด ํด๋ ์์
์ ๋ด๊ฒจ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์บ์๋ฅผ ์กฐํํ ํ์์์ด ๋ฐ๋ก ์ ํ๋ ์ด์ผ์
์ด์ ์ฌ์ฉ์๋ฅผ ํ์ธํ๊ณ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ค. ๋์ ๋ค๋ฅธ ํ ํฐ๋ณด๋ค ๊ธธ์ด๊ฐ ์ข ๊ธธ๋ค๋ ๋ฌธ์ ๋ ์๋ค.
https://blog.outsider.ne.kr/1160
์์์ ๋ณด์๋ฏ์ด ํด๋ ์์ ์ ์ํธํํ์ง ์๋๋ค. ๊ทธ๋์ ์๋ช ์์ด๋ ๋๊ตฌ๋ ์ด์ด๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์๋ ๋ณด์์ด ์ค์ํ ๋ฐ์ดํฐ๋ ๋ฃ์ผ๋ฉด ์ ๋๋ค. base64๋ก ์ธ์ฝ๋ฉํด์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ด ๋ถ๋ถ์ ๊ฐ๊ณผํ๊ธฐ ์ฌ์ด๋ฐ ํ์ํ ์ต์ํ์ ์ ๋ณด๋ง ํด๋ ์์ ์ ๋ด์์ผ ํ๋ค.
๋ฐ๋ผ์, User์ ์ด๋ฆ์ด๋ ์ด๋ฉ์ผ๊น์ง ๋ค์ด๊ฐ๋๋ผ๋, ๋น๋ฐ๋ฒํธ๊ฐ ๋ค์ด๊ฐ๋ฉด ์๋ ๋ฏ!!!!
์ ์ ๋ ๋จ์ํ ์๋ฒ๊ฐ ์ฃผ๋ ๋ด์ฉ์ ๋์ฝ๋ฉํด์ header์ payload๋ฅผ ์ฝ์ ์ ์์ ๋ฟ ์์ ์ ํด์ ์๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ด์ฉ์ ๋ณ์กฐํ๋ค๋ฉด ์๋ฒ๋ ์์๋ผ ์๊ฐ ์๋ค. ํ์ทจ๋์ด๋ signature์ ๊ณ ์ ํ ์๊ณ ๋ฆฌ์ฆ, ๋น๋ฐํค์ผ๋ก ์ํธํ๋์ด์๊ธฐ ๋๋ฌธ์ ๊ฑด๋๋ฆด ์๊ฐ ์๋๋ฐ, ์ฌ๊ธฐ์ header์ payload๋ฅผ ๊ฑด๋๋ ค๋ ์๋ฒ๋ ์ด๊ฒ ๋ณ์กฐ๋์๋ค๋ ๊ฒ์ ์์์๋ค.
ex)
๋ณ์กฐ ์ )
๋๊ตฐ๊ฐ payload๋ด์ฉ์ ๋ณ๊ฒฝ)
- But, ์ํธํ๋ Sign์ ๊ฑด๋๋ฆด ์ ์๊ธฐ์ Sign๋ฌธ์์ด์ ๊ทธ๋๋ก์ธ ์ํ!
Server๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํด ๋ฐ์ Header, Payload๋ก๋ถํฐ ๋ค์ ์ฐ๋ฆฌ ๋น๋ฐํค, ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ Sign์ ์์ฑํด๋ด.
- Signatureํํธ์ ๋ถ์ผ์น๋ฅผ ํ์ธ -> invalid Signature๋ผ ํ๋จ -> ์ธ์ฆ ์คํจ!