axios ์์ฒญ ์ header์ Token์ด ๋ด๊ธฐ์ง ์๋ ๋ฌธ์ ํด๊ฒฐ
by rlaehddnd0422ํ๋ก ํธ ์ธก์์ ์ฌ์ฉ์ A(ํ๋งค์)์ B(๊ตฌ๋งค์)๊ฐ ๊ฑฐ๋๊ฐ ์๋ฃ๋์์ ๋ A๊ฐ ๊ฑฐ๋ ์๋ฃ ๋ฒํผ์ ๋๋ฌ Trade Entity์ Complete_Trade ์ปฌ๋ผ์ false์์ true๋ก ๋ณ๊ฒฝํด์ฃผ๋ Patch API๊ฐ ๋์ํ์ง ์๋๋ค๋ ํผ๋๋ฐฑ์ ๋ฐ์๋ค.
ํ๋ก ํธ์์ axios.patch๋ก uri์ ์ ํ์ด ์์ฒญ์ด ๋ค์ด์ค๋๋ฐ ์๋ฒ ๋ก๊ทธ๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ์ด MethodNotSupportedException์ด ํฐ์ ธ๋ฒ๋ฆฐ ๊ฒ์ด๋ค. (Postman์ผ๋ก ํ ๋ ์๋๋๋ฐ)
๋ถ๋ช Postman์ผ๋ก ํ ์คํธํ์ ๋๋ ์ ๋์ํ๊ณ , ํ ์คํธ ์ฝ๋๋ ๋ฌธ์ ์์๋๋ฐ.. ํ์ฐธ ์์นญํ๋ค๊ฐ ํ๋ก ํธ ์ธก์์ CORS ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค. ์น๊ตฌ๊ฐ ํ๋ค๋ณด๋ฉด CORS ๋ง์ด ํฐ์ง๊ฑฐ๋ผ๊ณ ๊ฒ ์ค๋ ์ด๋ฐ์ ํ๋ฒ ์ก์๋๋๊น ์ด์ ์ํฐ์ง๋ค๊ณ ๋ต๋ต๊ฑฐ๋ ธ๋๋ฐ ๋ฒ๋ฐ์๊ฒ ๊ฐ๋ค.
๋จ์ CORS ์ค์ ์ ๋ฌธ์ ๊ฐ ์๋ ์ถ์ด์ CORS ์ค์ ๋ง ์์ ํด์ฃผ๋ฉด ํด๊ฒฐ ๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
CorsConfig๋ฅผ ๊ณ์ ์์ ํ๊ณ ๋น๋ํ๊ณ ์์ ํ๊ณ ๋น๋ํ๊ณ ํ๋๋ฐ๋ ํด๊ฒฐ์ด ์๋๊ณ ์ด ์๋ฌ์์ ๋ ์ด์ ์ง์ ์ด ์์๋ค.
๊ทธ๋ฌ๋ ๋์ค ์ ๊ธ์ ๋ณด๊ณ Security ๋ํ CORS ์ค์ ์ ํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ ์ฌ์ฐจ์ ์ฐจ Security์๋ CORS ์ค์ ์ ํด์ฃผ์๋ค.
๊ทธ๋ ๊ฒ ๋น๋ํ๊ณ ์๋ฒ๋ฅผ ํค๊ณ ์์ฒญ์ ๋ณด๋ด๋ดค๋๋ฐ CORS๋ ์ ํฐ์ง๋๋ฐ ์ฝ์์๋ 500 ์๋ฌ์ ํจ๊ป ์๋ฒ์๋ ๋ ๋ค์ MethodNotSupportedException์ด..
์ด์ฏค๋๋ CORS๊ฐ ๋จ์ง ์๋๋ฐ๋ CORS ๋ฌธ์ ์ธ์ง ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๋ ๊ฑด์ง ํท๊ฐ๋ฆฌ๊ธฐ ์์ํ๋ค.
์ด ์ ์ ๋ณธ์ธ์ ๋ณด ์์ ํ๋ API๋ patch method์๋๋ฐ ๊ทธ ๋๋ ํ๋กํ ์ด๋ฏธ์ง ๊ด๋ จ CORS๊ฐ ๋ฐ์ํด์ ๋ฆฌํํด์ ํ๋ฒ์ ํด๊ฒฐํ๋๋ฐ ์ด๋ฒ์๋ ์ด๋ฏธ์ง๋ ์๊ณ ๋จ์ํ ์ปฌ๋ผ๊ฐ๋ง ๋ฐ๊พธ๊ฒ ๋ค๋๋ฐ ์ ์ด๊ฑธ ๋ง๋์ง ๋ชจ๋ฅด๊ฒ ใท๋คใ
ฃ
๋ฌดํผ ๋ฌธ์ ๋ฅผ ์ผ๋จ ํด๊ฒฐ์ ํด์ผ๋๋๊น ํ๋ก ํธ์์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ์ฝ์์ ๋ค ๋ฏ์ด๋ณด์๋ค. ์๋ฒ์์ ์ค์ ํด๋ JwtFilter์์ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ํ์ธํ๋ค.
์ด๊ฒ ๋ฌด์จ๋ง์ด๋ ํ๋ฉด ๋ก๊ทธ์ธ์ ํ๋ฉด Access Token๊ณผ Refresh Token์ ๋ฐ๊ธํด์ฃผ๋๋ฐ ํค๋์ ๊ทธ ํ ํฐ์ด ๋ค์ด๊ฐ์ง ์๊ณ ์์ฒญ์ ๋ณด๋ธ ๊ฒ์ด์๋ค.
๋ก๊ทธ์ธ ์๋ฌ๋ฅผ ๋ณด๋ ์ ์๋ฒ์์ MethodNotSupportedException์ด ํฐ์ง๋์ง ๋๊ฐ ์ ์ถํ ์ ์์๋ค.
์ ์ถํ ๋ฐ๋ก๋ ์ด๋ ๋ค.
์ฃผ์ : ์ ๊ทธ๋ฆผ๊ณผ ๋ฐ์ ๋ฒํธ๋ ํฌ๊ฒ ์๊ด์ด ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ ํฐ๊ณผ ํจ๊ป ์์ฒญ์ ๋ณด๋๋ค.
- ์๋ฒ์์ ํ ํฐ์ด ํ์ํ ์์ฒญ์์ ์ธ์งํ๊ณ ํ ํฐ์ ํ์ธํด์ผ ํ๋๋ฐ ํ ํฐ์ด ์๋ค.
- ํ ํฐ์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ํ ํฐ ์์ฒด๊ฐ ์์ผ๋ฉด JwtAuthenticationEntryPoint์์ /exception/entry-point๋ก "GET" ๋ฉ์๋๋ก ๋ฆฌ๋ค์ด๋ ์ ํ๊ณ ExceptionController์์ ์ด URI๋ ๋งคํ๋ ๋ฉ์๋๊ฐ ์คํ๋์ Response์ ์๋ฌ๋ฅผ ๋ด์ ๋ฆฌํดํ๋๋ก ์ค์ ๋์ด ์๋ฐ.
- /exception/entry-point๋ก "GET"์ด ์๋ 1๋ฒ์์ ์์ฒญํ ๋ฉ์๋์ธ PATCH๋ก ๋๋ ์๋ฒ์์ ์ ๋ ๊ฒ ์์ธ๊ฐ ํฐ์ง๋ ๊ฒ ๊ฐ๋ค.
3๋ฒ์์ ์ GET์ด ์๋ PATCH๋ก ๋ฆฌ๋ค์ด๋ ์ ๋๋์ง๋ ๋ค์์ ๋ง์ ์๊ฐํด๋ณด์. ์ผ๋จ ๊ธํ ๊ฑด ํ ํฐ์ด ์ ํค๋์ ์๋ด๊ธฐ๋์ง ์์๋ด๋ ๊ฒ์ด ๋จผ์ ๋๊น
@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
private static final String EXCEPTION_ENTRY_POINT = "/exception/entry-point";
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
response.sendRedirect(EXCEPTION_ENTRY_POINT);
}
}
@ApiIgnore
@RestController
@RequestMapping("/exception")
public class ExceptionController {
@GetMapping("/access-denied")
public void accessDeniedException() {
throw new AccessDeniedException();
}
@GetMapping("/entry-point")
public void authenticateException() {
throw new AuthenticationEntryPointException();
}
@GetMapping("/invalid-token")
public void validateTokenException() {
throw new ValidateTokenException();
}
@GetMapping("/guard")
public void guardException() {
throw new GuardException();
}
@GetMapping("/no-token")
public void tokenNotFoundException() {
throw new TokenNotFoundException();
}
}
๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ฝ์ด๋ณด๋ (์ฝ์ ์ค ๋ชจ๋ฅด์ง๋ง) ์์ฒญ ํค๋์ A/R Token์ ์ ๋ด์ ์ฃผ์๋๋ฐ ์ค์ ๋ก ์์ฒญ ํค๋๋ฅผ ๋ณด๋ฉด ์ด๋ ํ ํฐํ๋ ๋ด๊ฒจ์์ง ์์๋ค. ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ ๋์ ์ ํํ๊ฒ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช์ ๋ถ์ ๊ธ์ ๋ฐ๊ฒฌํ๋ค.
๊ธ์ ์ฝ์ด๋ณด๋ฉด ๋์ ๋งค์ฐ๋งค์ฐ๋งค์ฐ ๋น์ทํ ๋งฅ๋ฝ์์์ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ๊ณ์
จ๋ค. ์ฌ์ง์ด ๋ ์๋ํด๋ณธ ํด๊ฒฐ๊ณผ์ ๋ค์ด ๋์ ์ ํํ ๊ฐ์๋ค.
์๋ง ์ด ๊ธ์ ๋ชป๋ดค๋ค๋ฉด ์์ง๋ CORS์ด๋ ํํฐ ๋ฌธ์ ๋ ์ํ๋ฆฌํฐ ๋ฌธ์ ๋ ํ๋ฉฐ ์ฝ์งํ์ ๊ฒ์ด๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ๋ญ์๋๋ฉด ํ๋ก ํธ์์ body์ ์๋ฌด๋ฐ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์ token์ด ์๋ฒ์ ์ ์ก๋์ง ์์๋ ๊ฒ์ด๋ค.
API์ ์์ฒญ body์ ์ ์๋ฌด๋ฐ์ดํฐ๋ ์๋๋ฉด ์ด API๋ id ๊ฐ๋ง ๋ณด๋ด๋ฉด ํด๋น Trade์ ID๊ฐ์ ์ฐพ์ ์ปฌ๋ผ๊ฐ๋ง ์ค์์นญํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด์๋๋ฐ, axios๋ ์๋ฌด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ง ์์ ๋ null๊ฐ์ด๋ผ๋ ๋๊ฒจ์ผ ํ๋ ๊ฒ์ด๋ค;;; axios์ null์ ๋ด์ ๋ณด๋ด์ฃผ๋ ์ ์๋ํ๋๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ฌ์ฐจ์ ์ฐจ ํด๊ฒฐ์ ํ๋๋ฐ, ์ด์ ๋๋ก ๋๋ฒ๊น
๊ณผ์ ์์ ์ฝ์ง์ ๋ง์ดํ๊ฑด ์ด๋ฒ์ด ์ฒ์์ธ๊ฒ ๊ฐ๋ค.
์ ๊ทธ๋ฆฌ๊ณ ์์ง ์ฐ์ฐํ ๋ถ๋ถ์ด ํ๋ ๋จ์๋ค. /exception/entry-point๋ก "GET"์ด ์๋ "PATCH"๋ก ์์ฒญ์ ํด์ ๊ดํ ํท๊ฐ๋ฆฌ๊ฒ ๋ง๋๋ ๊ฒ์ด๋๋ ๊ฒ์ด๋ค.
๋ด ์๊ฐ์ด๊ฑด๋ฐ, Body์ ์๋ฌด๋ฐ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ ํ๋ก ํธ์์ null์ด๋ผ๋ ๋ด์ ๋ณด๋ด์ฃผ์ด์ผ ํ๋๋ฐ ๊ทธ๋ ์ง ์์๋ค ๋ณด๋ body ์์ฒด๋ฅผ ๋ณด๋ด์ง ์๊ฒ ๋๊ณ , ์ด ๊ณผ์ ์์ ํ ํฐ๋ ๋ค์ด๊ฐ์ง ์๋ค๋ณด๋ ์ฌ๋ฌ์ฌ๋ฌ ์ํฉ์ด ๊ฒน์ณ์ ์ต์ด ์์ฒญ ๋ฉ์๋์๋ PATCH๊ฐ ๊ทธ๋๋ก Redirection์ ํ๋ฌ ๋ค์ด๊ฐ ๊ฒ ๊ฐ๋ค. ํ๋ง๋๋ก ๋ฒ๊ทธ
'๐ Etc > Sol' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Git Actions์ Docker๋ฅผ ์ด์ฉํ CI/CD pipeline ๊ตฌ์ถ (0) | 2024.03.01 |
---|---|
[AWS] Amazon S3 ๋ฒํท์์ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ (0) | 2023.09.12 |
[AWS] S3(Simple Storage Service)์๋ฒ์ Spring Boot ์ฐ๋ (0) | 2023.08.17 |
[MySQL] blocked because of many connection errrors ์๋ฌ ํด๊ฒฐ (0) | 2023.08.17 |
[DB] EC2 MySQL ์ฐ๋ ์ค ๋๋ฏธ ๋ฐ์ดํฐ ์ฝ์ ์ค๋ฅ ํด๊ฒฐ (0) | 2023.08.16 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422