์ด์ , ์ฒ์์ด๋ผ ๋จ๋ฆฌ์์ฃ ? ๊ฑฑ์ ๋ง์ธ์! ๋ณด์ด ์ด์ ์ปค๋ฎค๋ํฐ๊ฐ ์์ต๋๋ค.
์ฌ๊ธด ์ด๋ณด ์ด์ ์๋ค์ด ๋ชจ์ฌ, ๊ธฐ์ด๋ถํฐ ์์ ํ ์ด์ ํ๊น์ง ์๋ก ๊ณต์ ํ๊ณ ์ฑ์ฅํ๋ ๊ณต๊ฐ์ด์์.
ํจ๊ป๋ผ๋ฉด ์ฒซ ์ด์ ๋ ๋๋ ต์ง ์์์! ์ด์ , ๊ฐ์ด ์ฆ๊ฒจ๋ด์! ๐๐จ
โใใใพใ ํ๋ก์ ํธ ๋ธ๋ก์
: ๋ณด์ด์ด์ ๋ธ๋ก์
โใใใพใ ๋ฐฐํฌ ๋งํฌ : https://www.bocho.p-e.kr/
โใใใพใ ํ ๋
ธ์
: ๋ณด์ด์ด์ ๋
ธ์
2024ๅนด07ๆ19ๆฅ ~ 2024ๅนด08ๆ15ๆฅ
1. ๋ก๊ทธ์ธ: JWT ํ ํฐ ๋ฐฉ์, Spring Security
JWT(Json Web Token)๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ์ ๊ตฌํํ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธํ ๋, ์๋ฒ๋ AccessToken๊ณผ RefreshToken์ ๋ฐ๊ธํด ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค. AccessToken์ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ง๋ฃ๋๋ฉฐ, RefreshToken์ ํตํด AccessToken์ ์ฌ๋ฐ๊ธํ์ฌ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ์ ์ ์งํ๋ค. Spring Security๋ฅผ ํตํด ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ฌ์ฉ์ ์ ๋ณด์ ๋ณด์์ ๊ฐํํ๋ค. ์์ ๋ก๊ทธ์ธ(Kakao, Google) ๋ํ Spring Security์ OAuth2๋ฅผ ํตํด ๊ตฌํํ๋ค.
2. WebSocket
WebSocket์ ์ด์ฉํด ์ค์๊ฐ ํต์ ์ ๊ตฌํํ๋ค. ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ์๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ค์๊ฐ์ผ๋ก ์์ ๊ณต์ ๋ฐ ์ฐ์ ๋งค์นญ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋๋ก ์ค๊ณํ๋ค. HTTP์๋ ๋ฌ๋ฆฌ WebSocket์ ์ฐ๊ฒฐ์ด ์ ์ง๋ ์ํ์์ ๋ฐ์ดํฐ ๊ตํ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๋น ๋ฅธ ์๋ต ์๊ฐ๊ณผ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ค.
3. ์ด๋ฏธ์ง S3 ์ ๋ก๋
AWS S3(Simple Storage Service) ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ํ์ผ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ค. ์ฌ์ฉ์๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๋ฉด ์๋ฒ๋ ํด๋น ํ์ผ์ S3 ๋ฒํท์ ์ ์ฅํฉ๋๋ค. S3๋ ๊ณ ๊ฐ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํ์ฌ ๋๊ท๋ชจ์ ์ด๋ฏธ์ง ํ์ผ๋ ์์ ์ ์ผ๋ก ์ ์ฅํ ์ ์๋ค. ์ ๋ก๋๋ ์ด๋ฏธ์ง๋ URL ํํ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ํ์ํ ๋๋ง๋ค ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค. S3์ ์ฐ๋๋ ํ์ผ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๋น์ฉ ํจ์จ์ ์ด๋ฉฐ, ๋ฐ์ดํฐ ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ ๊ธฐ๋ฅ์ ํตํด ๋ณด์๊ณผ ์์ ์ฑ์ ์ ์งํ๋ค. ๋ํ, S3 ๋ฒํท์ ์ ์ฑ ์ค์ ์ ํตํด ์ ๋ก๋๋ ํ์ผ์ ๋ํ ์ ๊ทผ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ํ์ผ์ ๊ณต๊ฐ ์ฌ๋ถ๋ฅผ ์ค์ ํด ์ด๋ฏธ์ง ๋ณด์์ ๊ฐํํ ์ ์๋ค.
๐๋ก๊ทธ์ธ AccessToken, RefreshToken ๋ฐ๊ธ
๋ก๊ทธ์ธ ์ accessToken์ ๋ฐ๊ธํ ๋ loginFilter์์ token์ ๋ฐ๊ธํ์ง ์๊ณ controller์์ ์ง์ accessToken์ ๋ฐ๊ธํ๊ณ ์์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ด๋ฉด loginFilter๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก controller๋ก ๊ฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์๋๊ณ ์์๋ค.
this.setFilterProcessesUrl("/signin");
์์ ์ฝ๋๋ฅผ ํตํด UsernamePasswordAuthenticationFilter๊ฐ ๋ก๊ทธ์ธ ์์ฒญ์ ์ฒ๋ฆฌํ URL์ /signin์ผ๋ก ์ง์ ํฉ๋๋ค. ์ด ์ค์ ์ผ๋ก ์ธํด, ํด๋ผ์ด์ธํธ๊ฐ /signin ๊ฒฝ๋ก๋ก ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ผ ๋ ํด๋น ํํฐ๊ฐ ์ด ์์ฒญ์ ๊ฐ๋ก์ฑ์ด ์ฒ๋ฆฌํ๋๋ก ์ค์ ๋ฉ๋๋ค.
๐ท์ด๋ฏธ์ง ์ ๋ก๋ ๊ด๋ จ ์ค๋ฅ
์ด๋ฏธ์ง ์
๋ก๋๋ฅผ ์ํด form-data๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋งคํํ๋ ค๊ณ ํ ๋, ํด๋น ํ๋์ ์ ๊ทผํ์ง ๋ชปํด ์ปค๋ฎค๋ํฐ ๊ธ์ด ์์ฑ๋์ง ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
RequestDto ํด๋์ค์ @Getter ์ด๋
ธํ
์ด์
์ด ์์ด์, Spring Boot๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ํด๋น ํ๋์ ์ ๊ทผํ์ฌ ๋งคํํ์ง ๋ชปํ์ต๋๋ค.
- Spring์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์, ๋ด๋ถ์ ์ผ๋ก ํด๋น ํ๋์ Getter ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ ์ฝ์ด์ค๊ณ , ๋ํ ๊ฐ์ฒด๋ฅผ JSON์ด๋ ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํํ ๋๋ Getter๋ฅผ ์ฌ์ฉํฉ๋๋ค.
RequestDto ํด๋์ค์ @Getter ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํ์ฌ ๊ฐ ํ๋์ ๋ํ Getter ๋ฉ์๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด Spring์ด ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋งคํํ ์ ์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.