์ฟ ํค(cookie)๋ฅผ ์ด์ฉํ ์ธ์ ๊ธฐ๋ฐ์ ์ธ์ฆ์ ๊ฒฝ์ฐ ํน์ ์น์๋ฒ์์ ์ธ์ ์ํ(session state)๋ฅผ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ stateless ํ์ง์๋ค. ์๋ฒ ๋ก์ง์ด Stateless๊ฐ ์๋ ๊ฒฝ์ฐ ๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋์ผํ ์๋ฒ์ ์ซ์๋ฅผ ๋๋ฆฌ๋ ์ค์ผ์ผ ์์(scale out)์ ์ ํฉํ์ง ์๋ค. ๋ํ ๋๋ฉ์ธ์ด ๋ค๋ฅธ ์๋ฒ์ ๋ํด์๋ ํด๋น ์ธ์ ์ฟ ํค๊ฐ ๊ณต์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ฉ์ธ์ด ๋ค๋ฅธ ์๋ฒ์ ์์ฒญํ๊ธฐ ์ํด์๋ ๋งค๋ฒ ์๋กญ๊ฒ ์ธ์ฆ์ ํด์ผํ๋ ๋ถํธํจ๋ ์กด์ฌํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋งค๋ฒ http ์์ฒญ๋ง๋ค http header์ ์ธ์ฆ ํ ํฐ(authorization token)์ ๊ฐ์ด ๋ณด๋ด๋ ํํ์ ๋ฐฉ๋ฒ์ ๋ง์ด ์ฌ์ฉํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ ํฐ ์์๋ ์ด๋ค ์ ์ ๊ฐ ๋ณด๋ด๋ ์์ฒญ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ํด์ ์ ์ ID๊ฐ์ด ํฌํจ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๋ฒ์ชฝ์์ ์ธ์ ์ํ๋ฅผ ์ ์งํ ํ์๊ฐ ์์ด์ ์ค์ผ์ผ ์์์ ์ ํฉํ๋ฉฐ, ๋๋ฉ์ธ์ด ๋ค๋ฅธ ์๋ฒ์ ์์ฒญํ๋ ๊ฒฝ์ฐ์๋ ๋์ผํ ํ ํฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฌํ ํ ํฐ๊ธฐ๋ฐ์ ์ธ์ฆ์ ์ ์ฉํ๋ ๊ฒฝ์ฐ ์ ์์ ์ธ ์ ์ ๊ฐ ๋ค๋ฅธ ์ ์ ID๋ฅผ ์ฌ์นญํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ํ ํฐ์ ์๋ช (signature)์ ํฌํจํ๊ฑฐ๋, ๋์นญํค ์ํธํ๋ฅผ ์ ์ฉํ๋ค.
์ด๋ฌํ ๋ฐฉ์์ API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ ๋ง์ ์ฌ๋๋ค์ด ๊ณตํต์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค ๋ณด๋ ์ค๋ณต๋ ๊ฐ๋ฐ์ ๋ง๊ธฐ ์ํด์ JWT (JSON Web Token)๋ผ๋ ํ์ค์ด ๋ง๋ค์ด์ง๊ฒ ๋์๋ค. ์ค์ ๋ก ์ง์ API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๊ฑฐ๋ Auth0, AWS Cognito ๋ฑ์ ์ธ์ฆ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ํ๋ซํผ์์๋ JWT๊ฐ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค.
aud ํ๋์ ํฌํจํ๋ฉด ๋๊ณ , ๋ค์๊ณผ ๊ฐ์ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅธ๋ค.
๋ณดํธํ๋ ค๊ณ ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ํ๋์ key๋ก ์ํธํ ๋์ด์๋ ๊ฒฝ์ฐ ํด๋น key๊ฐ ์ ์ถ๋๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ถ๋๊ฒ ๋๋ค. ์ด๋ฌํ ์ํ์ฑ์ ์ค์ด๊ธฐ ์ํด์ ์ํด์ ์ฃผ๊ธฐ์ ์ผ๋ก key๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ key rotation ์ด๋ผ๊ณ ํ๋ค. ์ด ๊ฒฝ์ฐ ํน์ key๊ฐ ์ ์ถ๋๋๋ผ๋, ํน์ ๊ธฐ๊ฐ๋์์ ์์ฑ๋ ๋ฐ์ดํฐ๋ง ์ ์ถ๋๊ณ , ๋ค๋ฅธ key๋ก ์ํธํ๋ ๋ฐ์ดํฐ๋ ์์ ํ๋ค.
์ผ๋ฐ์ ์ธ ์ธ์ฆ์์ ๊ฒฝ์ฐ 1~2๋ ์ ๋์ ์ ํจ๊ธฐ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค. ์ธ์ฆ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํด ๋ณดํต ๊ตฌ๋ฒ์ ์ ์ธ์ฆ์๊ฐ ๋ง๋ฃ๋๋ ์์ ๊ณผ ์๋ก์ด ์ธ์ฆ์์ ์ ํจ๊ธฐ๊ฐ์ ๊ฒน์น๋๋ก ์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ณ , ๊ฒน์น๋ ๊ธฐ๊ฐ๋์์ ๋ ์ธ์ฆ์๋ฅผ ๋ชจ๋ ์ง์ํด์ผ ํ๋ค. ๊ฒฐ๊ตญ ์ธ์ฆ์๋ public key, private key์ ์กฐํฉ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ ์ฐจ๋ key rotation์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
RSA public key๋ modulus์ public exponent๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๋๋ฌธ์ n, e ๊ฐ์ด ์ฃผ์ด์ง๋ฉด, public key๊ฐ ์ฃผ์ด์ง ๊ฒ์ด๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
private key์๋ n, e ์ ๋ณด๊ฐ ๋๋ค ์๊ธฐ๋๋ฌธ์ private key๋ง ์์ผ๋ฉด public key๋ฅผ ์ถ์ถํด ๋ผ ์ ์๋ค.
RFC 3447์ ์ ์๋ ASN.1 ํ์์ ๋ณด๋ฉด RSA public, private key ์ ๊ตฌ์ฑ ์์๋ค์ ์ ์ ์๋ค.
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
AWS์์ ์ ๊ณตํ๋ Cognito User Pool ์ธ์ฆ์ ํตํด์ ๋ฐ๊ธ๋ฐ์ JWT๋ฅผ ์ด์ฉํ์ฌ API ์๋ฒ์์๋ ์ธ์ฆ์ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น?
ํ๋ฆ์ ๊ฐ๋จํ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ ํ๋ก์ธ์ค๋ฅผ ์งํํ๊ธฐ ์ํด AWS Cognito User Pool ๊ธฐ์ค์ผ๋ก ๋ค์ ํ์ํ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด์. JWT์ ์ ํจ์ฑ ๊ฒ์ฆ(verify) ํ๊ธฐ ์ํ AWS ๊ฐ์ด๋ ์ ๋์์๋ ๋ด์ฉ์ ์์ฝํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
JWK URL์์ Public keyํค ๊ฐ์ ธ์ค๊ธฐ
์ ๋ฌ๋ฐ์ JWT์์ SHA256(message)๋ฅผ ๊ณ์ฐ
์ ๋ฌ๋ฐ์ JWT์ signature๋ฅผ public key๋ก ๋ณตํธํ ํ์ฌ ์์ ๊ฐ๊ณผ ๋์ผํ์ง ํ์ธ (signature๋ SHA256(message)๋ฅผ private key๋ก ์ํธํํ ๊ฐ์ด๊ธฐ ๋๋ฌธ)
์ถ๊ฐ๋ก, Auth0์์ JWT, JWK๋ฅผ ํ์ฉํ๋ ๋ฐฉ์๋ ์ฐธ๊ณ ํ ๋ง ํ๋ค.