์ด์ , ์ฒ์์ด๋ผ ๋จ๋ฆฌ์์ฃ ? ๊ฑฑ์ ๋ง์ธ์! ๋ณด์ด ์ด์ ์ปค๋ฎค๋ํฐ๊ฐ ์์ต๋๋ค.
์ฌ๊ธด ์ด๋ณด ์ด์ ์๋ค์ด ๋ชจ์ฌ, ๊ธฐ์ด๋ถํฐ ์์ ํ ์ด์ ํ๊น์ง ์๋ก ๊ณต์ ํ๊ณ ์ฑ์ฅํ๋ ๊ณต๊ฐ์ด์์.
ํจ๊ป๋ผ๋ฉด ์ฒซ ์ด์ ๋ ๋๋ ต์ง ์์์! ์ด์ , ๊ฐ์ด ์ฆ๊ฒจ๋ด์! ๐๐จ
โ ํ๋ก์ ํธ ๋ธ๋ก์
: ๋ณด์ด์ด์ ๋ธ๋ก์
โ ๋ฐฐํฌ ๋งํฌ : https://www.bocho.p-e.kr/
โ ํ ๋
ธ์
: ๋ณด์ด์ด์ ๋
ธ์
2024.07.19 ~ 2024.08.15
๋ฐ์ฐฌ์ |
ํ์ฑํ |
์กฐ์์ธ |
๊น์์ |
์ ํจ์ด |
![]() |
![]() |
![]() |
![]() |
![]() |
FrondEnd/Leader | FrondEnd | BackEnd/Vice Leader | BackEnd | BackEnd |
![](https://private-user-images.githubusercontent.com/138704514/358456210-691059b9-bfda-48be-800d-f1ba2dcc0c20.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyOTUyMTEsIm5iZiI6MTczOTI5NDkxMSwicGF0aCI6Ii8xMzg3MDQ1MTQvMzU4NDU2MjEwLTY5MTA1OWI5LWJmZGEtNDhiZS04MDBkLWYxYmEyZGNjMGMyMC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjExJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxMVQxNzI4MzFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00YjZlZjUwM2MxMWFkNjFmNDE1M2IyODBiNDI4MGEwZmQ0Yjc3NzEzNTMyYWY1NDhkYTYzZTY1YTQyMjlkZjk4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.T0pohrxxtPTt_auEHZ-pjxiJhlt13HUccyZbTZ-LTO4)
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์ด ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋งคํํ ์ ์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.