๊ณผ์ ๋ฅผ ํ๋ฉฐ ํํ์ด ํ ๊ณต๋ถ ๊ธฐ๋ก.โ๐ป ์์ง๋ ์ ๋ฆฌํ ๊ฒ๋ค & ์ฐ๊ณ ์๋ ๊ฒ๋ค์ด ์ฐ๋๋ฏธ๋ผ์ ์ฌ๋ฆฌ์ง ๋ชปํ ๊ธฐ๋ก์ด ๋ง๋ค. ๋นจ๋ฆฌ ์จ์ ์ฌ๋ ค์ผ๊ฒ ๋ค!
์ด์ Spring Security ๋์
์ ๋ง๋ฌด๋ฆฌ ํ๊ณ , ๋ค์ ๋จ๊ณ๋ฅผ ์งํํ๋ค๊ฐ ์ผ์ ์ ์์ฑํ๋ ๋ถ๋ถ์์ ๋ค์๊ณผ ๊ฐ์ด NPE๊ฐ ๋ฐ์ํ๋ค.
Postman์์๋ 403 Forbidden ์๋ฌ๊ฐ ๋ ์ํฉ์ด๋ค.
ํ์๊ฐ์
๊ณผ ๋ก๊ทธ์ธ์ ์ ์์ ์ผ๋ก ๋๊ณ , DB์๋ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ค ๋น ์ง์์ด ๋ค์ด์๋ค.
์ userRole์ด null์ธ๊ฐ...๐ค DB์๋ ๋ค ๋ค์ด์๋๋ฐ ์ null์ด์ง...?
์ด ์ํฉ์ ๋ฏฟ์ ์๊ฐ ์์ด ์์ฑ์์์ userRole์ด null์ผ ๋ ์๋ฌ๋ฅผ ๋์ง๋๋ก ํด ๋ค์ ํ ๋ฒ ํ์ธํด๋ดค๋ค.
null์ด ๋ง๋ค. ๊ทธ๋ ๋ค๋ฉด ์์ผ๊น?
๊ฒ์์ ๋ช์ ๋น ์ ธ์๋ค๊ฐ ์ฌ๋ฌ ์ํฉ์ ๊ฐ์ ํ๊ณ ํ์ธํด๋ณด์๋ค.
userRole
์ ๋ค๋ฅธ ๋จ์ด๋ก ์
๋ ฅํ ๊ฒฝ์ฐuserRole
๋ก ๊ฐ์.userRole
์ด ํฌํจ๋์ง ์์ ๊ฒฝ์ฐJwtAuthenticationFilter
์์ setAuthentication()
์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ์ฌ๊ธฐ์ ํด๋น ๋ฉ์๋๋ JWT ํ ํฐ์ ๊ฒ์ฆํ ํ, Spring Security์ SecurityContext์ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ญํ ์ ํ๋ค. ์ฌ๊ธฐ์ JwtAuthenticationToken
๋ถ๋ถ์ ๋ณด๋ฉด Spring Security์์ ์ฌ์ฉํ Authentication ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
JwtAuthenticationToken
ํด๋์ค๋ก ๊ฐ์ ๋ค์ ํ ๋ฒ ์ดํด๋ณด๋ ์ฌ์ฉ์์ ๊ถํ(userRole
)์ ์ค์ ํ๊ณ , ์ธ์ฆ๋ ์ฌ์ฉ์๋ก setํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋งจ ์๋ getPrincipal()
๋ฉ์๋๋ฅผ ํตํด ํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ฐํํ๋ค. ์ฌ๊ธฐ์ ์ด getPrincipal()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๋ฐ๋ผ์ ๋๋ ์ด ๋ถ๋ถ์ ์ด์ฉํด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์ด TodoController
์ saveTodo()
๋ฉ์๋์์ @Auth
์ด๋
ธํ
์ด์
์ ์ฃผ์ ์ฒ๋ฆฌํ ํ, ์ง์ getPrincipal()
๋ฉ์๋๋ฅผ ๋ถ๋ฌ authUser
์ ๋ฃ๊ณ ํ
์คํธ ํด๋ดค๋ค.
๋๋์ด ์ ๋๋ก ์ผ์ ์ด ์์ฑ๋์๋ค! ํ์ง๋ง @Auth
๋ฅผ ์ด์ฉํด ๋ฐ๊ฟ์ผ ํ๋๋ฐ, ์ด ๋ถ๋ถ์์ ๋ด๊ฐ ์ด์ ์ค์๋ฅผ ํ๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค.
๋ฐ๋ก ํ์ผ ์ ๋ฆฌ๋ฅผ ํ๋ค๊ฐ ์๊ฐ์์ด AuthUserArgumentResolver
์ WebConfig
๋ฅผ ์ญ์ ํด๋ฒ๋ฆฐ ๊ฒ์ด๋ค.... ์ด ๋ถ๋ถ์ ์ญ์ ํ์ง ๋ง๊ณ Spring Security๋ก ๋ณ๊ฒฝํ์ด์ผ ํ๋๋ฐ, ํ์์๋ค๊ณ ์๊ฐํด์ ์ง์ ๋ค. ์ฐจ๋ผ๋ฆฌ ์ง์ฐ์ง ์์๋๋ผ๋ฉด ๋ ๋นจ๋ฆฌ ํด๊ฒฐํ ์ ์์์ ํ
๋ฐ ๋ง์ด๋ค. ์ ํํ ์ดํด ์์ด ์ ์ฉํ๋ ค๊ณ ๋ง ํด์ ์ด๋ฐ ์ผ์ด ๋ฒ์ด์ง ๊ฒ ๊ฐ๋ค.๐
๋ฐ๋ผ์ ๋ค์ ํด๋น ํ์ผ์ ๋ง๋ ํ, AuthUserArgumentResolver
์ resolveArgument()
๋ฉ์๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๋ค. ์ด์ ์๋ ๊ฐ์ request์์ ํ๋์ฉ ๊ฐ์ ธ์ ์๋ก์ด AuthUser ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ค.
์์ ํ, ํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์(SecurityContextHolder.getContext().getAuthentication()
) Principal์ ๊บผ๋ด(getPrincipal()
) AuthUser๋ก ๋ฐํํ๋ค. ์ด๋ ๊ฒ ๋ฐํ๋ AuthUser๋ TodoController
์ authUser
ํ๋ผ๋ฏธํฐ์ ์๋์ผ๋ก ๋ค์ด๊ฐ๋ค.
๋ฐ๋ผ์ ๊ธฐ์กด๊ณผ ๊ฐ์ด ์ด๋ ๊ฒ ์ ์ด์ค๋ ์ด์ ์ ์์ ์ผ๋ก ๋ค์ด๊ฐ๋ค.
Postman์์๋ ์ ํ
์คํธ ๋๋ค.
์, ์ด๋ ๊ฒ ๊ฒจ์ฐ๊ฒจ์ฐ ์๋ฌ๋ฅผ ํด๊ฒฐํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์๋ ์ด๋ ธํ ์ด์ ํ๋๋ก ํด๊ฒฐํ ์ ์์๋ค.
@AuthenticationPrincipal
'
์ด๋ ๊ฒ ๋ฐ๊พธ๋ฉด ๋ฐ๋ก ์ ์ฉ ๊ฐ๋ฅํ๋ค.
...๋ ์ค๋ ๋ญํ๊ฑฐ์ง...?๐ ํ์ ๋ถ์ด ๋ง์ง๋ง ์คํฌ๋ผ๋ ์๋ ค์ฃผ์ ์ ์์๋ค. ๊ฐ์๋ฅผ ๋ ์์ธํ ๋ด์ผํ๋ค๋ ๊ตํ์ ์ป์๋ค.
Error creating bean with name 'jwtAuthenticationFilter' defined in file ...
์ค๋ฅJwtAuthenticationFilter
ํด๋์ค๊ฐ JwtUtil
์ ์ฃผ์
๋ฐ์ผ๋ ค๊ณ ํ๋๋ฐ ์คํ๋ง ์ปจํ
์ด๋์ JwtUtil
๋น์ด ๋ฑ๋ก๋์ด ์์ง ์์ ๋ฐ์ํ ์ค๋ฅ์ด๋ค.JwtUtil
์ Mock์ผ๋ก ์ฃผ์
ํด ํด๊ฒฐํ์๋ค.@WithMockUser
์ ์ถ๊ฐํด ํ
์คํธ์ฉ์ผ๋ก ๊ฐ์ง ์ธ์ฆ ๊ฐ์ฒด(SecurityContext)์ ๋ฃ์ด์ฃผ๋ ์ญํ ์ ํ๋๋ก ํ๋ค.application.properties
์์ DB ์ค์ ์ ์ฃผ์ ์ฒ๋ฆฌํํ ๋ค์ ๋น๋ํ๋ค.ps -ef | grep java
๋ช
๋ น์ด๋ฅผ ์ด์ฉํด PID๋ฅผ ํ์ธ ํ, kill -9 [PID]
๋ช
๋ น์ด๋ก ๊ธฐ์กด ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ ํ, ๋ค์ ์๋ฒ๋ฅผ ์คํํ๋ค.8080
ํฌํธ๊ฐ ์ด๋ ค ์๋์ง ํ์ธํ๋ค. ๋ง์ฝ ์ด๋ ค์์ง ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด Inbound rules์ 8080
ํฌํธ๋ฅผ ์ถ๊ฐํ๋ค.nohup java -jar expert-0.0.1-SNAPSHOT.jar &
๋ช
๋ น์ด ์ค๋ฅ : nohup: failed to run command 'java': No such file or directory
๋ผ๋ ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ๋ํ๋ฌ๋ค. EC2 ์ธ์คํด์ค์ Java๊ฐ ์ค์น๋์ด ์์ง ์์์ ๋ฐ์ํ ์ค๋ฅ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด Java๋ฅผ ์ค์น ํ ๋ค์ ์๋ํ๋ค. sudo apt update
sudo apt install openjdk-17-jdk -y
java.net.ConnectException
โ ์์ DB๋ก ๋คํธ์ํฌ ์ฐ๊ฒฐ ์์ฒด๊ฐ ์ ๋ ์ํโ RDS ์ฐ๊ฒฐ๋ง ๋จ์ ์์ด์ ํ ์คํธ ๋๋ฆฌ๋๊น RDS๋ก ๋ถ์ผ๋ ค๋ค๊ฐ ์คํจํ ์ํฉ
๋ฐ๋ผ์ ๋ค์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ๋ค.
application-local.properties
๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ํด๊ฒฐํ๋ค.application-local.properties
๋ก ์คํ โ application.properties
์ spring.profiles.active=local
์ถ๊ฐapplication-local.properties
ํ์ผ์ ์ฝ์ด๋ผ! ๋ผ๋ ๋ป.local
์ ๋ช
์ํด์ผ ๋ก์ปฌ DB ์ฐ๊ฒฐ, ๋ก์ปฌ์ฉ S3 ํค๋ก ํ
์คํธ๊ฐ ๊ฐ๋ฅํ๋ค.