์คํฌ์ธ ๋ด์ค ์ปค๋ฎค๋ํฐ
- 2022๋ 6์ 24์ผ ~ 7์ 29์ผ
- 4์ธ ํ ํ๋ก์ ํธ
- Java 11
- Spring Boot 2.7.2
- Gradle 7.4.1
- Spring Data JPA
- MySQL 8.0.28
- Spring Security
- HTML5
- CSS3
- Javascript
- Bulma
- BootStrap
- JQuery
๋ค์ด๋ฒ์ ์คํฌ์ธ ๋ด์ค๋ฅผ ์คํฌ๋ํํ์ฌ ํด๋ก๋ฐ ์์ฝ API๋ก ๊ฐ ๋ด์ค๋ฅผ ์์ฝํด ๋ณด์ฌ์ค๋๋ค.
ํ์๋ค์ด ๋ด์ค์ ๋ํ ์๊ฒฌ์ ๋๊ธ๋ก ๋๋ ์ ์์ต๋๋ค.
๋ง์์ ๋๋ ๋ด์ค๋ฅผ ๋ถ๋งํฌํ๊ฑฐ๋ ๋ค๋ฅธ ํ์์ ๋๊ธ๊ณผ ๋ถ๋งํฌ๋ฅผ ๋ชจ์๋ณผ ์ ์์ต๋๋ค.
์์ธ ์ ๋ณด ๋ณด๊ธฐ
API ๋ช
์ธ์ ๋ณด๊ธฐ
default.mp4
์ธ์ฆ๊ณผ ๋๋ถ์ด ํ์๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ (ํ์๊ฐ์
, ํ๋กํ ๋ฑ) ์ ๋ด๋นํ์ต๋๋ค.
์๋์ ํ ๊ธ ํญ๋ชฉ์์ ์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ์ฝ๋์ ๊ฐ๋ตํ ์ค๋ช
์ ๋ณด์ค ์ ์์ต๋๋ค.
ํ์ ์์ฑ
- json body๋ฅผ ๋ฐ์ @Valid ์ด๋ ธํ ์ด์ ์ ํตํด ์ ํจ์ฑ์ ๊ฒ์ฆํฉ๋๋ค.
- ํธ๋์ญ์ ์ผ๋ก ํ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ๋ ๊ธฐ๋ณธ ๊ถํ๊ณผ ํ๋กํ์ ํจ๊ป ์ ์ฅํฉ๋๋ค.
์ธ์ฆ
- Spring Security๋ฅผ ์ฌ์ฉํ์ฌ ํํฐ์์ ์ฒ๋ฆฌํฉ๋๋ค.
html form์ผ๋ก ์ ๋ ฅ๋ฐ์ ๊ฐ์ HttpServletRequest ๊ฐ์ฒด์์ ๊ฐ์ ธ์ต๋๋ค.
dto ๊ฐ์ฒด๋ฅผ ํตํด ์ ํจ์ฑ ๊ฒ์ฆ ํ UserDetailsService์ ์ ๋ฌํ์ฌ ์กฐํํ๊ณ UserDetails ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ User ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. UsernamePasswordAuthenticationToken์ ์์ฑ, AuthenticationManager์ ์ ๋ฌํฉ๋๋ค.
- ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด JWT๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
ํ ํฐ์ ์ ๊ทผ ํ ํฐ๊ณผ ๊ฐฑ์ ํ ํฐ์ ๋ฐ๊ธํ๋ฉฐ, ์ฌ์ฉ์ ID์ ํจ๊ป DB์ ์ ์ฅ๋ฉ๋๋ค.
๋ค๋ฅธ ๊ธฐ๋ฅ์์ ์ธ์ฆ๋ ์ฌ์ฉ์ ID๋ฅผ ํ์๋ก ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋๋ก ํค๋์ ์ฌ์ฉ์ ID๋ ํจ๊ป ๋ฐํํฉ๋๋ค.
์ธ๊ฐ
- Spring Security๋ฅผ ์ฌ์ฉํ์ฌ ํํฐ์์ ์ฒ๋ฆฌํฉ๋๋ค.
์ ๊ทผ ํ ํฐ์ ํ์ด ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ DB์ ์ ์ฅ๋ ํ ํฐ ๊ฐ์ผ๋ก ์ฌํ์ธ ํฉ๋๋ค.
์ ์์ ์ธ ์ ๊ทผ์ด๋ผ๋ฉด UserDetails ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ User ๊ฐ์ฒด์ ๊ถํ์ผ๋ก UsernamePasswordAuthenticationToken์ ์์ฑํฉ๋๋ค.
SecurityContext์ ๋ณด๊ดํฉ๋๋ค.
ํ๋กํ ์์
- ์ธ์ฆ๋ ์ฌ์ฉ์ ID๋ก ๊ธฐ์กด ํ๋กํ ์ ๋ณด๋ฅผ ์ฐพ๊ณ , ์
๋ ฅ๋ฐ์ ํ๋กํ ์ ๋ณด๋ก ๋ณ๊ฒฝํฉ๋๋ค.
ํ๋กํ ์ฌ์ง์ aws sdk ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ s3์ ์ ๋ก๋ํฉ๋๋ค.
-
๋ก๊ทธ์ธ ์ฌ์ฉ์์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ ์คํจ
UserDetails๊ฐ null์ ๋ฐํํ๋ ๋ฌธ์
๋๊ธ ๋ฑ ๋ค๋ฅธ ๊ธฐ๋ฅ์์ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ํ์ํ์ฌ @AuthenticationPrincipal ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ SecurityContext์ UserDetails ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ต๋๋ค.
Authentication ๊ฐ์ฒด์ Principal์ ๊ฐ์ ธ์ค๋ ๊ณผ์ ์์ ๊ธฐ์กด์๋ username ์์ฒด, ์ฆ String์ ๋ฃ์๊ธฐ ๋๋ฌธ์ null์ด ๋ฐํ๋์์ต๋๋ค.
์ด๋ฅผ UsernamePasswordAuthenticationToken ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ UserDetails๋ฅผ ๊ตฌํํ User ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค์ผ๋ก์จ ํด๊ฒฐํ์์ต๋๋ค. -
๋น๋ก๊ทธ์ธ ์ฌ์ฉ์ ์๋น์ค ์ํํ ์ด์ฉ ๋ถ๊ฐ
๋น๋ก๊ทธ์ธ ์ฌ์ฉ์์ ๊ฒฝ์ฐ principal์ด null์ ๋ฐํํ์ฌ ์ค๋ฅ ๋ฐ์ํ๋ ๋ฌธ์
์ด ์๋น์ค์ ๊ฒฝ์ฐ, ๋น๋ก๊ทธ์ธ ์ฌ์ฉ์๋ ์กฐํ ๊ธฐ๋ฅ์ ์ ํ ์์ด ์ด์ฉํ ์ ์๋๋ก ํ๊ณ ์ ํ์ต๋๋ค.
๊ทธ๋ฌ๋ @AuthenticationPrincipal ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ์๋ก ํ๋ ์กฐํ API์ ๊ฒฝ์ฐ anonymousUser ๋ฌธ์์ด์ ๋ฐํํ๊ฒ ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ด๋ฅผ ํด๋น ์ด๋ ธํ ์ด์ ์ ์ปค์คํ ํ์ฌ ๋น๋ก๊ทธ์ธ ์ฌ์ฉ์์ ๊ฒฝ์ฐ null์ ๋ฐํํ๋๋ก ํจ์ผ๋ก์จ ํด๊ฒฐํ์์ต๋๋ค.
ํ์ ID ์ค๋ณต ์กฐํ ๋ถ๊ฐ
- ์ค๋ณต ์กฐํ url์ด SecurityConfig ๋ด permitAll() ๋๋ฝ๋์ด ์ถ๊ฐํ์ฌ ํด๊ฒฐ
ํํฐ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ์
- ์ปจํธ๋กค๋ฌ์ ํต์ผ๋์ง ์์ ExceptionHandlerFilter ํด๋์ค ์์ฑ, ์ปค์คํ ์์ธ๋ฅผ ๋ฐ์์์ผ ํด๊ฒฐ
๊ฐํ์ ์ผ๋ก ๋ก๊ทธ์ธ, ๋ก๊ทธ์์์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์๋ ๋ฌธ์
- AJAX์ async ์ต์ ์ ์ฃผ์ด ๋๊ธฐ์ ์ฒ๋ฆฌ๋ก ํด๊ฒฐ