๐ ์ด๋ฒ ๊ธ์์๋ ์ง๋ ์๊ฐ๊น์ง ๋ง๋ ๋ด์ฉ์ ๊ฐ๋ณ๊ฒ ์ ๋ฆฌํ๊ณ , jwt ํ ํฐ ๋ฐ๊ธ๊ณผ redis์ ํ ํฐ์ ์ ์ฅํ๋ ๊ณผ์ ์ ์ค๋ช ํฉ๋๋ค.
๐ค ์ ์ ์คํ๋ง ์ํ๋ฆฌํฐ ๊ตฌํ์ ์๋์ ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค.
- ํ๋ก ํธ ์๋์ ๋ฐฑ์๋๊ฐ ๋๋์ด ์งํ๋๋ ํ๋ก์ ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์คํ๋ง ์ํ๋ฆฌํฐ ์ค์ ์์ ๋ก๊ทธ์ธ ํ์ด์ง์ ๋ํ ์ค์ ์ ๋ฐ๋ก ํ์ง ์์
- JWT ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํจ
- ํ ํฐ ๊ด๋ฆฌ์ Redis๋ฅผ ์ด์ฉํจ
๐ ์ด์ ๊ธ ๋ณด๊ธฐ
์ฒซ ๋ฒ์งธ ๊ธ๋ถํฐ ์ ๋ ํ์๋ฉด ๋ณด๋ค ์ฝ๊ฒ ์ดํดํ์ค ์ ์์ต๋๋ค!
https://suzuworld.tistory.com/438 - ๋น์ ์ ์ฒซ ํ๋ก์ ํธ๋ฅผ ์ํ ์คํ๋ง ์ํ๋ฆฌํฐ ํบ์๋ณด๊ธฐ
์ด์ ๊ธ
https://suzuworld.tistory.com/441 - AuthenticationManager, AuthenticationProvider, UserDetailsService, UserDetails
๐ ๋ชฉ์ฐจ
์คํ๋ง ์ํ๋ฆฌํฐ ํบ์๋ณด๊ธฐ
SecurityConfig ๊ตฌ์ฑํ๊ธฐ
์ธ์ฆ ๋ฐฉ์ ๊ฐ๋ ๊ณผ AuthenticationFilter
AuthenticationManager, AuthenticationProvider, UserDetailsService, UserDetails
๋ก๊ทธ์ธ ํ ์คํธ ๋ฐ JWT, Redis ๊ฐ๋ ์ ๋ฆฌ (ํ์ฌ ๊ธ)
๐ช๋ค์ด๊ฐ๊ธฐ ์ ์
์ง๋ ์๊ฐ๊น์ง์ ๋ด์ฉ์ ์ ๋ฆฌํด ๋ด ์๋ค.
์ง๋ ์๊ฐ์ ๊ธ๊ณผ ๊ฐ์ ๋ด์ฉ์ด๋ฏ๋ก ์ดํดํ์ ๋ถ๋ค์ ๋์ด๊ฐ์ ๋ ๋ฉ๋๋ค.
- (0) ์ํคํ ์ฒ์ ๋ฑ์ฅํ์ง ์์ง๋ง ์ฌ์ฉ์๊ฐ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ํ๊ณ ํ์๊ฐ์ ์ ํ์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ํ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ํฌํจํ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํจ๊ป ์ ์ฅ๋๋ฉฐ ์ด๋ ๋น๋ฐ๋ฒํธ๋ Bcrypt๋ก ๋จ๋ฐฉํฅ ์ํธํ๋์ด ์ ์ฅ๋ฉ๋๋ค.
- (1) Http Request๋ก ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์๋ ์์ฒญ์ด ์์ต๋๋ค. ์ด ์์ฒญ ๋ฉ์์ง ์์๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ ์ ๋ ฅํ ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ ๋ด๊ฒจ์์ต๋๋ค.
- (2) AuthenticationFilter๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ก๊ทธ์ธ ์ ๋ณด(์์ด๋, ๋น๋ฐ๋ฒํธ)๋ฅผ UsernamePasswordAuthenticationToken์ ๋ด์ต๋๋ค.
- (3) AuthenticationManager์๊ฒ ๋งค๋์ ์ญํ ์ ๋ถ์ฌํ๊ณ UsernamePasswordAuthenticationToken์ ์ฃผ๋ฉด์ ๋ก๊ทธ์ธ ๊ฒ์ฆ์ ํ๋ผ๊ณ ์ํต๋๋ค.
- (4) AuthenticationManager๋ ์ง์์์ด๋ฉฐ, ์ค์ ๊ฒ์ฆ ์ญํ ์ ์ํํ AuthenticationProvider์๊ฒ ๋ก๊ทธ์ธ ๊ฒ์ฆ์ ์ง์ํฉ๋๋ค. ์ ํฌ๋ ์ด ์ค์ DaoAuthenticationProvider๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- (5) AuthenticationProvider๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ ์
๋ ฅํ ์ ๋ณด์ธ UsernamePasswordAuthenticationToken์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด์ ํ์ํ ๊ฑด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ด ์๋ ์ฌ์ฉ์์ ์ ๋ณด์
๋๋ค. ์ด ๋์ ๋น๊ตํ ๊ฒ์ด๋๊น์.
- ๊ทธ๋ฐ๋ฐ, AuthenticationProvider๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ์ผ์ ์ง์ ํ์ง ์์ต๋๋ค. UserDetailsService๋ผ๋ ๋ ์์๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค์ด๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ผ๊ณ ์ํต๋๋ค.(ํ์ฒญ์ ํ์ฒญ์ ํ์ฒญ์ ๋๋ค.)
- (6) UserDetailsService๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ ํด๋น ์ ๋ณด๋ฅผ UserDetails์ ๊ตฌํ์ฒด์ ๋ด์ ์ ๋ฌํฉ๋๋ค.
- (7) UserDetailsService๋ ์ด๋ฅผ AuthenticationProvider์๊ฒ ์ ๊ณตํ์ฌ ์ค์ ๋น๊ต(๋ก๊ทธ์ธ ๊ฒ์ฆ)๋ฅผ ์์ํฉ๋๋ค. ์ด๋ ๋์จ ๊ฒฐ๊ณผ๊ฐ ๋ก๊ทธ์ธ ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ด๋ฉฐ ์ด๋ฅผ ๋ฆฌํดํฉ๋๋ค.
์ง๋ ์๊ฐ์ ์ด๋ฏธ ๋ก๊ทธ์ธ์ ๊ธฐ๋ณธ ๊ตฌํ์ด ๋๋ฌ์ต๋๋ค. ๊ทธ๋ผ ํฌ์คํธ ๋งจ์ ํตํด ๋ก๊ทธ์ธ์ด ๋๋์ง ํ์ธํด ๋ด ์๋ค!
๐๐ปโ๏ธ ๋ก๊ทธ์ธ ํ ์คํธ
MemberController
- ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ๋ง๋ ํ์๊ฐ์ ๋ก์ง์ ๋๋ค.
- ๋ํ, ์ง๋ ์๊ฐ์ ๊ธฐ์กด ํจ์ค์๋๋ฅผ ํ๋ฌธ์ผ๋ก ์ ์ฅํ๋ ๋ก์ง์ passwordEncoder๋ฅผ ํตํด BCypt ์ํธํํ์ฌ ์ ์ฅํ๋๋ก ๋ณ๊ฒฝํ์์ฃ .
- ์์๋๋ก ํ์๊ฐ์ ์ด ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
- ๋น๋ฐ๋ฒํธ ์ญ์ "bbb" ํ๋ฌธ์ด ์ํธํ๋์ด ์ ์ฅ๋จ์ ํ์ธํ ์ ์์ต๋๋ค.
- h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ ์์ ์ผ๋ก ์ ์ฅ๋๋ค์.
- ์ด์ ๋ก๊ทธ์ธ์ ์๋ํด ๋ด ์๋ค.
- ๋ก๊ทธ์ธ์ ์๋ํฌ์ธํธ๋ ์ด๋ป๊ฒ ์ง์ ํ์์ฃ ?
SecurityConfig
- SpringConfig์ scurityFilterChain์ "/login"์ด๋ผ๊ณ ์ค์ ํด ๋์์ต๋๋ค.
- ์ฌ๊ธฐ์ ํ ๊ฐ์ง ์ค๋ช
์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
- ์์ "/enroll"๊ณผ "/login"์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น?
- ์ด ๋ถ๋ถ์ ์ดํดํ์ง ๋ชปํ๋ฉด ์คํ๋ง MVC์ ๊ณต๋ถ๊ฐ ํ์ํฉ๋๋ค.
- "/enroll" ์๋ํฌ์ธํธ๋ ์ปจํธ๋กค๋ฌ ์์ญ์์ ์ง์ ํ ์๋ํฌ์ธํธ์ด๋ฉฐ, "/login"์ ๊ฒฝ์ฐ ์ปจํธ๋กค๋ฌ์ ๋๋ฌํ๊ธฐ ์ ํํฐ์ ์ฒ๋ฆฌ๋๋ ์๋ํฌ์ธํธ์ ๋๋ค.
- ๋ฐ๋ผ์ "/login"์ด๋ผ๋ ์๋ํฌ์ธํธ๋ฅผ ์ปจํธ๋กค๋ฌ์์ ์ง์ ํ์ฌ ๋ก์ง์ ๋ง๋ค๊ฒ ๋๋ฉด ์ถ๊ฐ์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๊ทธ๋ฌ๋, ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๊ณผ์ ์ด ๋ชจ๋ ํํฐ๋จ์์ ๋์ํ๋ฏ๋ก ์ปจํธ๋กค๋ฌ์ ๋ฐ๋ก ๊ตฌํ์ ํ์ง ์์์ต๋๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ต๊ฐ์ ๋ํ ๋ถ๋ถ์ ์ปจํธ๋กค๋ฌ์์ ์คํ๋ง์ด ์ ๊ณตํ๋ ResponseEntity ๋ฑ์ ์ฌ์ฉํ ์ ์๊ณ ์ง์ ์๋ต๊ฐ์ ๋ง๋ค์ด๋ด์ผ ํฉ๋๋ค.
- ์์ ๊ฐ์ ์ ๋ณด๋ก ๋ก๊ทธ์ธ์ ์๋ํ๋๋ 403 Forbidden์ด ๋จ๋ค์.
- ๋ถ๋ช ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์ ํฐ์ ๋๋ค.
- ๋ก๊ทธ์๋ ์ด๋ค ์๋ฌ๋ ๋จ์ง ์๋๋ฐ ์ฌ์ค ์ด ์ด์ ๊น์ง๋ ์ ํํ ์ค๋ช
์ ๋๋ฆด ์ ์์ผ๋ ๋ก๊ทธ์ธ์ด๋ ํ์ ์์ฒด๊ฐ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ ์
๋ ฅํ ์ ๋ณด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ๋น๊ตํ๋ ๊ณผ์ ์ด๊ณ , ๋น๊ต๊ฐ ๋๋ฌ์ ๋์ ์ฑ๊ณต/์คํจ ์ฒ๋ฆฌ๊ฐ ์์ง ๊ตฌํ์ด ๋์ง ์์ ์๊ธด ๋ฌธ์ ๋ผ๋ ๊ฒ์ด๋ผ๊ณ ๋ง ๋ง์๋๋ฆด ์ ์์ต๋๋ค.
- ํน์ ์ ํํ ์ด์ ๋ฅผ ์๊ณ ๊ณ์ ๋ค๋ฉด ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค. ใ
AuthenticaionSuccessHandler & AuthenticaionFailureHandler
- ์ ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
- ์ธ์ฆ ์ฑ๊ณต/์คํจ์ ๋ฐ๋ฅธ ํธ๋ค๋ฌ๊ฐ ์ด๋ฏธ ์ธํฐํ์ด์ค๋ก ์กด์ฌํฉ๋๋ค.
- ์ด ๊ณผ์ ์ ์ ๊ฐ ์ ํํ ์ฐพ์๋ณด์ง ์์์ ์ด๋ ๊ฒ ๋ฐ์ ์ค๋ช ์ ๋๋ฆฌ์ง ๋ชปํ๋ ์ ์ํด ๋ถํ๋๋ฆฝ๋๋ค.
- ์ฑ๊ณต or ์คํจํ์ ๋์ ๊ฐ๊ฐ ์๋ต๊ฐ์ ํ ์คํธ๋ฅผ ์ํด ๋ก๊ทธ๋ง ์ฐ์ด๋์์ต๋๋ค.
- ๋ค์ ๊ธ์ ๋ก๊ทธ์ธ ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ ๋ฐ๋ฅธ ์๋ต๊ฐ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
- ํต์ฌ์ passwordEncoder์ matches ๋ฉ์๋๋ฅผ ํตํด ๋ก๊ทธ์ธ ์ ์ ๋ ฅํ ๋น๋ฐ๋ฒํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ์ฌ์ฉ์ ์ ๋ณด์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋น๊ตํ์ฌ true๊ฐ ๋์ค๋ฉด ์ฑ๊ณตํ์ ๋์ handler๋ก ๊ฐ๊ณ , false์ผ ๊ฒฝ์ฐ ์คํจํ์ ๋์ handler๋ก ๊ฐ๊ฒ ํด์ผ ์ ์์ ์ผ๋ก ์๋ํ๋ค๋ ๊ฒ์ ๋๋ค.
- ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ์ธ์ฝ๋ฉ ํ matches() ๋ฉ์๋๋ก ๋น๊ต ์ true ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ํ์ธํด ๋ณด์์ต๋๋ค.
SecurityConfig - securityFilterChain
- SecurityConfig์ securityFilterChain์ jwyAuthenticationFilter์ ๋ํ ์ธํ ์ ๋ณด๋ฅผ ๋ง๋ค์ด๋์๋๋ฐ์. ์ฌ๊ธฐ์ ์์ ๋ง๋ค์ด๋์๋ ์ฑ๊ณต ํธ๋ค๋ฌ์ ์คํจ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๐ ๋ก๊ทธ์ธ ์๋
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฅํ์ ๊ฒฝ์ฐ์๋ ์ฑ๊ณต ํธ๋ค๋ฌ๋ก ๋น ์ ธ "๋ก๊ทธ์ธ ์ฑ๊ณต!"์ด๋ ๋ก๊ทธ๊ฐ ์ฐํ๊ณ , ํ๋ฆฌ๊ฒ ์ ๋ ฅํ์ ๋๋ ์คํจ ํธ๋ค๋ฌ๋ก ๋น ์ ธ "๋ก๊ทธ์ธ ์คํจ!"๋ ๋ก๊ทธ๊ฐ ์ฐํ์ ํ์ธํ ์ ์๊ณ ๋ ๋ค ์๋ต์ 200์ผ๋ก ๋ณ๊ฒฝ๋์์์ ํ์ธํ ์ ์์ต๋๋ค.
๐ JWT ๋ฐ๊ธ๊ณผ ๊ด๋ฆฌ
์ด์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํด ๋ณผ ๋ด์ฉ์ ๋ก๊ทธ์ธ ์ดํ์ ๊ณผ์ ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๋์ ์ฌ์ฉํ๋ ์น์ฌ์ดํธ๋ฅผ ์๊ฐํด ๋ด ์๋ค. ์ผ๋จ ๋ก๊ทธ์ธ์ ํ๋ฉด ๋ด ์ ๋ณด ์์ ์ ๋ค์ด๊ฐ๋, ์์ ์ ๋ธ๋ก๊ทธ์ ๊ธ์ ์ฐ๋ ค๊ณ ํด๋, ๊ฒฐ์ ๋ด์ญ์ด๋ ์ฅ๋ฐ๊ตฌ๋ ๋ฑ์ ๋ค์ด๊ฐ๋ ๋ณ๋์ ์ธ์ฆ๊ณผ์ ์ ๊ฑฐ์น์ง ์์ต๋๋ค.(๋ฌผ๋ก , ๋น๋ฐ๋ฒํธ๋ฅผ ํ ๋ฒ ๋ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด ํฉ๋๋ค.) ์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ์ ๋ํด ์๊ฐํด ๋ด ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก HTTP ํต์ ์ ๋น์ฐ๊ฒฐ์ฑ๊ณผ ๋ฌด์ํ์ฑ์ด๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฆ, HTTP๋ ์ฐ๊ฒฐ์ ์ง์ํ์ง๋ ์์ผ๋ฉฐ ์ํ๋ฅผ ์ ์งํ์ง๋ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ก๊ทธ์ธ์ ์ฒ๋ฆฌํ์ฌ ์ฑ๊ณตํ๊ฒ ๋๋ฉด ๋ก๊ทธ์ธ์ ํ๋ค๋ ์ฐ๊ฒฐ๊ณผ ์ํ๋ฅผ ๋ค์ ํต์ ์ ์ ์งํ์ง ์๋๋ค๋ ๊ฒ์ด์ฃ . ๋จ์ํ ์๊ฐํด ์ด ๋ฐฉ์๋๋ก๋ผ๋ฉด ๋ชจ๋ ์์ฒญ์ ๋ก๊ทธ์ธ์ ๊ณ์ํ์ฌ ๊ฒ์ฆ์ ๊ฑฐ์น๊ณ ์ํ๋ ์์ ์ ์ํํ๋๋ก ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๋ ํ ์น์ฌ์ดํธ๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ด์๋์ง๋ ์์ฃ .
์ด์ ๊ด๋ จ๋ ๋ด์ฉ์ ์ด๋ฏธ ์ง๋ ๊ธ์์ ๋ค๋ฃจ์์ผ๋ฏ๋ก ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ JWT๋ฅผ ๋ฐ๊ธํ๊ณ ๊ด๋ฆฌํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ์ ํจ ์๊ฐ ๋ด์ ์ฌ ๋ก๊ทธ์ธ ์์ด ์์ ๋กญ๊ฒ ํต์ ํ๋๋ก ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ผ ์ง๊ธ๊น์ง ๋ง๋ ๋ก์ง์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ก ๋ก๊ทธ์ธ์ด ์ฑ๊ณตํ๋ฉด JWT๋ฅผ ๋ฐ๊ธํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต๊ฐ์ผ๋ก ์ ์กํ๋ ๊ฒ์ ๋๋ค.
โ๏ธ JWT์ ๋์ ์๋ฆฌ
์ฌ๊ธฐ์ ๊ฐ๋จํ ์์ฝ๋ ๋ด์ฉ์ ์ค๋ช ๋๋ฆฌ๋ JWT์ ๋ด๋ถ ๊ตฌ์กฐ๋ ์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ์ ๋ถ๋ค์ ๊ฒ์์ ํตํด ํด๊ฒฐํด ์ฃผ์๋ฉด ๋ฉ๋๋ค.
JWT์๋ Access Token๊ณผ Refresh Token์ด ์กด์ฌํฉ๋๋ค.
๋ก๊ทธ์ธ์ด ์ฑ๊ณตํ์ฌ ์ด ๋ ๊ฐ์ ํ ํฐ์ด ๋ฐ๊ธ์ด ๋๋ฉด ์๋ฒ์์๋ ์๋ต๊ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์ ํ ํฐ์ ์ ๋ฌํฉ๋๋ค.
Access Token์ ์ ํจ ์๊ฐ์ด ์งง์ ํธ์ด๋ฉฐ, Refresh Token์ Access Token์ ๋นํด ์๋์ ์ผ๋ก ์ ํจ ์๊ฐ์ด ๊น๋๋ค.
ํด๋ผ์ด์ธํธ๋ ๋ฐ๊ธ๋ฐ์ Access Token์ผ๋ก ๊ถํ์ด ํ์ํ ๋ฆฌ์์ค์ ์ ๊ทผํฉ๋๋ค.
Access Token์ด ๋ง๋ฃ๋์๋ค๋ฉด ์๋ฒ์์๋ Access Token์ด ๋ง๋ฃ๋์๊ธฐ ๋๋ฌธ์ ์๋ฌ ์๋ต์ ๋ฆฌํดํ ๊ฒ์ ๋๋ค.
๋ณดํต์ ํด๋ผ์ด์ธํธ์์ ๋จผ์ Access Token์ด ๋ง๋ฃ๋์์์ ๊ฐ์งํ๊ณ , ์๋ฒ์ Refresh Token์ ํฌํจํ์ฌ ์๋ก์ด Access Token์ ์์ฒญํฉ๋๋ค.
ํด๋ผ์ด์ธํธ์์ Access Token ์ฌ๋ฐ๊ธ์ ์ํด Refresh Token์ ๋ณด๋ด ์๋ฒ๋ก๋ถํฐ ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ๋ช ์์ Refresh Token ์์ฒญ์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋, Refresh Token์ ์ ํจ ์๊ฐ๋ ๋๋๊ฒ ๋๋ฉด ์ฌ๋ก๊ทธ์ธ์ ํตํด ๋ ํ ํฐ์ ์ฌ๋ฐ๊ธ๋ฐ์ต๋๋ค.
์๋์ผ๋ก Refresh Token์ ์์ฒญํ๊ฒ ๊ตฌํํ ์๋ ์์ต๋๋ค. ๋ชจ๋ ์์ฒญ์ Access Token๊ณผ Refresh Token์ ์ฃ๊ณ ์๋ฒ์๊ฒ Access Token์ ์ ํจ ์๊ฐ ์ฒดํฌ๋ฅผ ๋งก๊ฒจ ๋ง๋ฃ๋์์ ๊ฒฝ์ฐ ํจ๊ป ๋ณด๋ธ Refresh Token์ผ๋ก Access Token์ ์ฌ๋ฐ๊ธ ์ฒ๋ฆฌํ๋๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ ๋ช ์์ Refresh Token ์์ฒญ์ด ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ Access Token์ ๋ง๋ฃ๋ฅผ ๊ฐ์งํ๊ณ , ํ์ํ ๊ฒฝ์ฐ์๋ง Refresh Token์ ์ฌ์ฉํ์ฌ ์๋ก์ด Access Token์ ์์ฒญํ๋ ๋ฐฉ์์ผ๋ก ๋ถํ์ํ ์์ฒญ์ ์ค์ผ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๊ตฌํ์ด ๊ฐ๋จํ ์ ์์ง๋ง ๋งค ์์ฒญ๋ง๋ค Refresh Token์ ์ ์กํ๋ ๊ฒ์ ๋ณด์์ ์ํํ ์ ์์ต๋๋ค.
Refresh Token์ ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ํด์๋ฉ๋๋ค.
๋ณด์๊ณผ ํจ์จ์ฑ์ ๊ณ ๋ คํ ๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ฎ๐ปโ๏ธ ํ ํฐ์ ๊ตฌ์กฐ์ ๊ด๋ฆฌ
ํ ํฐ ๊ตฌ์กฐ
Access Token
- ์ผ๋ฐ์ ์ผ๋ก JWT(JSON Web Token) ํ์์ผ๋ก ๋ฐ๊ธ๋ฉ๋๋ค.
- JWT๋ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค: Header, Payload, Signature
- ๊ฐ ๋ถ๋ถ์ ์ (.)์ผ๋ก ๊ตฌ๋ถ๋์ด ์์ผ๋ฉฐ, ์ ์ฒด JWT๋ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ๋ํ๋ฉ๋๋ค
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT ์น์ฌ์ดํธ์์ ๋์ฝ๋ฉํด ๋ณด๊ธฐ
- ์ฌ์ง๊ณผ ๊ฐ์ด ์ธ ๋ถ๋ถ์ผ๋ก ๋๋์ด ์์ผ๋ฉฐ ๋์ฝ๋ฉ ์ ๊ฐ ์ธ ๋ถ๋ถ์ ๋ค์ด์๋ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
Header
- JWT์ ํ์ ๊ณผ ์๋ช ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํฉ๋๋ค.
- ๊ตฌ์ฑ: ์ผ๋ฐ์ ์ผ๋ก JSON ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
- alg: ์ฌ์ฉ๋ ์๋ช ์๊ณ ๋ฆฌ์ฆ (์: HMAC SHA256, RSA ๋ฑ)
- typ: ํ ํฐ์ ํ์ (๋ณดํต "JWT"๋ก ์ค์ )
Payload
- ํ ํฐ์ ๋ด๊ธธ ํด๋ ์(claims)์ ํฌํจํฉ๋๋ค.
- ํด๋ ์์ ์ฌ์ฉ์ ์ ๋ณด๋ ๊ถํ, ํ ํฐ์ ์ ํจ ๊ธฐ๊ฐ ๋ฑ์ ๋ํ๋
๋๋ค.
- iss(๋ฐ๊ธ์), exp(๋ง๋ฃ ์๊ฐ), sub(์ฃผ์ ), aud(๋์) ๋ฑ์ด ์์ต๋๋ค.
Signature
- JWT์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ํ ํฐ์ด ๋ณ์กฐ๋์ง ์์์์ ํ์ธํฉ๋๋ค.
- Header์ Payload๋ฅผ ์ธ์ฝ๋ฉํ ํ, ๋น๋ฐ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช
์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ์๋ช
ํฉ๋๋ค.
- ์ฌ๊ธฐ์ ๋น๋ฐ ํค๋ ์๋ฒ์์ ์์๋ก ๋ง๋ญ๋๋ค. ์ด ๊ณผ์ ์ ๊ตฌํ ๊ณผ์ ์ ์์ธํ ๋ณด์ฌ๋๋ฆฝ๋๋ค.
- ์ด ๊ณผ์ ์์ ์ฌ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ Header์ ๋ช ์๋ alg์ ๊ฐ์ต๋๋ค.
๋ณต์กํ๋ค๊ณ ๋๋ผ๊ฒ ์ง๋ง ์คํ๋ง ์ํ๋ฆฌํฐ์์ ๋ง์ ๋ถ๋ถ์ ์๋์ผ๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์๋ ๊ฐ๋ ๋ง ์ดํด๋ณด๊ณ ์ค์ ๋ก ๊ตฌํ์ ํตํด ์ดํดํ๋ ๊ฒ์ด ๋ ๋น ๋ฆ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ณ๊ฒ ์ฝ์ด๋ณด์๋ฉด ๋ฉ๋๋ค!
๋นจ๊ฐ์์ผ๋ก ํ์ํ ๋ถ๋ถ์ด ํต์ฌ ๋ด์ฉ์ ๋๋ค.
Refresh Token
- Refresh Token์ ๊ตฌ์กฐ ์ญ์ JWT๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- Access Token์ ์ฌ๋ฐ๊ธ์ ๋ชฉ์ ์ด ์๊ธฐ ๋๋ฌธ์ ํด๋ ์ ๋ฑ์ ๋ด์ฉ์ด Access Token๊ณผ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
- ์๋ฒ์์ ๊ด๋ฆฌ๋๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ธฐ๋ ํ์ง๋ง, ์ฌ๊ธฐ์๋ redis์ ์ ์ฅํ๋๋ก ๊ตฌํํ ์์ ์ ๋๋ค.
๊ฒ์ฆ ๊ณผ์
Access Token ๊ฒ์ฆ
Signature ๊ฒ์ฆ
- ์๋ฒ๋ Access Token์ Signature๋ฅผ ๊ฒ์ฆํ์ฌ ํ ํฐ์ด ๋ณ์กฐ๋์ง ์์๋์ง ํ์ธํฉ๋๋ค.
- ์ด ๊ณผ์ ์์ ์๋ฒ๋ ํ ํฐ์ Header์ ํฌํจ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น๋ฐ ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํ ํฐ์ ๋ค์ด์๋ Header์ Payload๋ฅผ ์๋ฒ์ ๋น๋ฐ ํค๋ก ํด์ฑํ์ฌ ํ ํฐ์ Signature์ ๊ฐ์์ง ํ์ธํ๋ ์์ ์ ๋๋ค.
- ๋ด์ฉ์ด ์กฐ๊ธ์ด๋ผ๋ ์กฐ์๋์๋ค๋ฉด ๊ฒฐ๊ด๊ฐ์ด ์์ ๋ฌ๋ผ์ง๋ ํด์ ํจ์์ ํน์ง์ ์ด์ฉํด Header์ Payload์ ์กฐ์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ์ฌ๊ธฐ์ ํ ๊ฐ์ง ํน์ง์ Header์ Payload์ ๋ด์ฉ์ด ์คํ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, JWT ์์ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋ณด์ ์ ๋ณด๋ฅผ ๋ด์์๋ ์๋ฉ๋๋ค.
- ์๋ฒ์ ๋น๋ฐ ํค๋ก ํด์ฑํ ํด์๊ฐ์ด ์๋ก ๊ฐ๋ค๋ ์ด์ผ๊ธฐ๋ ๋ ํด์๊ฐ ๋ชจ๋ ์๋ฒ์์ ๋ง๋ค์ด์ง ๋น๋ฐ ํค๋ฅผ ์ฌ์ฉํ๋ค๋ ์ด์ผ๊ธฐ์ด๋ฏ๋ก ์๋ฒ์์ ๋ฐ๊ธํ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๊ฒ ๋ฉ๋๋ค.
์ ํจ ๊ธฐ๊ฐ ํ์ธ
- Payload์ ํฌํจ๋ exp(๋ง๋ฃ ์๊ฐ) ํ๋๋ฅผ ํ์ธํ์ฌ ํ ํฐ์ด ๋ง๋ฃ๋์๋์ง ํ์ธํฉ๋๋ค.
๋ฐ๊ธ์ ํ์ธ
- Payload์ ํฌํจ๋ iss(๋ฐ๊ธ์) ํ๋๋ฅผ ํ์ธํ์ฌ ํด๋น ํ ํฐ์ด ์ ๋ขฐํ ์ ์๋ ์๋ฒ์์ ๋ฐ๊ธ๋ ๊ฒ์ธ์ง ํ์ธํฉ๋๋ค.
Refresh Token ๊ฒ์ฆ
๋ฐ์ดํฐ ์ ์ฅ์
- Refresh Token์ ๋ฐ์ดํฐ ์ ์ฅ์์ ์ ์ฅ๋ฉ๋๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ Refresh Token์ ๋ฐ์ดํฐ ์ ์ฅ์์์ ์กฐํํ์ฌ ํด๋น ํ ํฐ์ด ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ฅ์๋ RDBMS์ผ์๋ ์๊ณ , redis, memcached์ ๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ ํจ์ฑ ํ์ธ
- redis์์ ์กฐํํ Refresh Token์ด ์ ํจํ์ง, ๋ง๋ฃ๋์๋์ง, ๋๋ ์ด๋ฏธ ์ฌ์ฉ๋์๋์ง ํ์ธํฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก Refresh Token์ ํ ๋ฒ ์ฌ์ฉ๋๋ฉด ๋ฌดํจํ๋๋๋ก ์ค๊ณ๋์ง๋ง ๊ตฌํํ๊ธฐ ๋๋ฆ์ ๋๋ค.
์ฌ์ฉ์ ์ ๋ณด ํ์ธ
- Redis์์ Refresh Token๊ณผ ํจ๊ป ์ ์ฅ๋ ์ฌ์ฉ์ ์ ๋ณด(์: ์ฌ์ฉ์ ID)๋ฅผ ํ์ธํ์ฌ, ํด๋น ํ ํฐ์ด ์ด๋ค ์ฌ์ฉ์์ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
๐ฅ redis
- redis๋ ์คํ ์์ค ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ์ฅ์๋ก ์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์บ์, ๋ฉ์์ง ๋ธ๋ก์ปค๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- Redis๋ ํค-๊ฐ ์ ์ฅ์๋ก ์๋ํ๋ฉฐ ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ(๋ฌธ์์ด, ํด์, ๋ฆฌ์คํธ, ์ ๋ฑ)๋ฅผ ์ง์ํฉ๋๋ค.
- ๋น ๋ฅธ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฉฐ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋์ ์๋๋ฅผ ์๋ํฉ๋๋ค.
Refresh Token์ ๊ด๋ฆฌํ ๋ RDBMS๊ฐ ์๋ Redis๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ์์ ์ธ๊ธํ๋ฏ์ด Refresh Token์ ๊ด๋ฆฌํ ๋ ๊ธฐ์กด์ ์ฌ์ฉ ์ค์ธ RDBMS(ex. mysql)์ด ์๋ redis๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ์ต๋๋ค.
- ์๊ฐํด ๋ณด๋ฉด ๋ฐ์ดํฐ ์ ์ฅ์์ ์ญํ ์ ํ๋ ๋ฌด์์ด๋ Refresh Token์ ์ ์ฅํ ์ ์์ต๋๋ค.
- ๊ทธ๋ฐ๋ฐ, ์ redis๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๊น์?
์๋
- redis๋ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฐ์ดํฐ ์ ๊ทผ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
- Refresh Token์ ๊ฒ์ฆ ๋ฐ ๋ฐ๊ธ ๊ณผ์ ์์ ๋น ๋ฅธ ์๋ต์ด ํ์ํ๊ธฐ ๋๋ฌธ์ Redis๊ฐ ์ ํฉํฉ๋๋ค.
TTL(์๊ฐ ์ ํ)
- Redis๋ ๊ฐ ํค์ ๋ํด TTL์ ์ค์ ํ ์ ์์ด Refresh Token์ ๋ง๋ฃ ์๊ฐ์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ง๋ฃ๋ ํ ํฐ์ redis์์ ์๋์ผ๋ก ์ญ์ ๋๋ฏ๋ก ๊ด๋ฆฌ๊ฐ ๊ฐํธํฉ๋๋ค.
๋น์ฉ ํจ์จ์ฑ
- redis๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ ๊ทผํ๋ ๋ฐ์ดํฐ(์: Refresh Token)๋ฅผ ์ ์ฅํ๋ ๋ฐ ๋น์ฉ ํจ์จ์ ์ ๋๋ค.
- RDBMS๋ ๋์คํฌ ๊ธฐ๋ฐ์ผ๋ก ์์ฃผ ์ฝ๊ณ ์ฐ๋ ๋ฐ์ดํฐ์ ๋ํด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ํ, ๊ธฐ์กด์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ JPA ๋ฑ๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ ๋ ๋ฆฌ๋ ๋ฐ์๋ ๋น์ฉ์ด ๋ง์ด ๋๋๋ฐ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ํ๋๋ฅผ ์ํด RDBMS์ ์ ์ฅํ๋ ๊ฑด ๋นํจ์จ์ ์ด๋ผ๊ณ ๋ด ๋๋ค.
๊ฐ๋จํ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- Refresh Token์ ๊ฐ๋จํ ํค-๊ฐ ์์ผ๋ก ์ ์ฅํ ์ ์์ด redis์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ ๋ง์ต๋๋ค. RDBMS์์๋ ๋ถํ์ํ๊ฒ ๋ณต์กํ ํ ์ด๋ธ ๊ตฌ์กฐ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
๐จ๐ป๐ป ๋ค์ ์๊ฐ
- ์๋ฒ์์ ์ง์ ๊ตฌํํ๋ฉด์ JWT์ redis์ ๋ํด ์์ธํ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.