# axios ์š”์ฒญ ์‹œ header์— Token์ด ๋‹ด๊ธฐ์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ
Study Repository

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๋ฅผ ๊ณ„์† ์ˆ˜์ •ํ•˜๊ณ  ๋นŒ๋“œํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ๋นŒ๋“œํ•˜๊ณ  ํ–ˆ๋Š”๋ฐ๋„ ํ•ด๊ฒฐ์ด ์•ˆ๋˜๊ณ  ์ด ์—๋Ÿฌ์—์„œ ๋” ์ด์ƒ ์ง„์ „์ด ์—†์—ˆ๋‹ค.
 
 

[Spring boot X Spring Security] CORS ์„ค์ •ํ•˜๊ธฐ

2022.03.14 - [์‹ค์ „ ๊ณต๋ถ€/Java&Spring&SpringBoot] - [REACT x SPRING BOOT] Axios + multipart/form-data ๊น”๋”ํ•˜๊ฒŒ ๋ฐ›๊ธฐ (ํŒŒ์ผ + ๊ฒŒ์‹œ๋ฌผ ๋™์‹œ์— ๋ฐ›๊ธฐ) [REACT x SPRING BOOT] Axios + multipart/form-data ๊น”๋”ํ•˜๊ฒŒ ๋ฐ›๊ธฐ (ํŒŒ์ผ + ๊ฒŒ์‹œ๋ฌผ ๋™

ktae23.tistory.com

๊ทธ๋Ÿฌ๋˜ ๋„์ค‘ ์œ„ ๊ธ€์„ ๋ณด๊ณ  Security ๋˜ํ•œ CORS ์„ค์ •์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ์—ฌ์ฐจ์ €์ฐจ Security์—๋„ CORS ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๋‹ค.
 
๊ทธ๋ ‡๊ฒŒ ๋นŒ๋“œํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ํ‚ค๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด๋ดค๋Š”๋ฐ CORS๋Š” ์•ˆ ํ„ฐ์ง€๋Š”๋ฐ ์ฝ˜์†”์—๋Š” 500 ์—๋Ÿฌ์™€ ํ•จ๊ป˜ ์„œ๋ฒ„์—๋Š” ๋˜ ๋‹ค์‹œ MethodNotSupportedException์ด..

์ด์ฏค๋˜๋‹ˆ CORS๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋ฐ๋„ CORS ๋ฌธ์ œ์ธ์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฑด์ง€ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. 
 
์ด ์ „์— ๋ณธ์ธ์ •๋ณด ์ˆ˜์ •ํ•˜๋Š” API๋„ patch method์˜€๋Š”๋ฐ ๊ทธ ๋•Œ๋Š” ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๊ด€๋ จ CORS๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๋ฆฌํŽ™ํ•ด์„œ ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ–ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” ์ด๋ฏธ์ง€๋„ ์—†๊ณ  ๋‹จ์ˆœํžˆ ์ปฌ๋Ÿผ๊ฐ’๋งŒ ๋ฐ”๊พธ๊ฒ ๋‹ค๋Š”๋ฐ ์™œ ์ด๊ฑธ ๋ง‰๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ใ„ท๋‹คใ…ฃ
 
๋ฌดํŠผ ๋ฌธ์ œ๋ฅผ ์ผ๋‹จ ํ•ด๊ฒฐ์€ ํ•ด์•ผ๋˜๋‹ˆ๊นŒ ํ”„๋ก ํŠธ์—์„œ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ์ฝ˜์†”์„ ๋‹ค ๋œฏ์–ด๋ณด์•˜๋‹ค. ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•ด๋‘” JwtFilter์—์„œ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.
 
์ด๊ฒŒ ๋ฌด์Šจ๋ง์ด๋ƒ ํ•˜๋ฉด ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด Access Token๊ณผ Refresh Token์„ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š”๋ฐ ํ—ค๋”์— ๊ทธ ํ† ํฐ์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ธ ๊ฒƒ์ด์˜€๋‹ค.
 
๋กœ๊ทธ์ธ ์—๋Ÿฌ๋ฅผ ๋ณด๋‹ˆ ์™œ ์„œ๋ฒ„์—์„œ MethodNotSupportedException์ด ํ„ฐ์ง€๋Š”์ง€ ๋Œ€๊ฐ• ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 
์œ ์ถ”ํ•œ ๋ฐ”๋กœ๋Š” ์ด๋ ‡๋‹ค.

์ฃผ์˜ : ์œ„ ๊ทธ๋ฆผ๊ณผ ๋ฐ‘์— ๋ฒˆํ˜ธ๋Š” ํฌ๊ฒŒ ์ƒ๊ด€์ด ์—†์Šต๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ† ํฐ๊ณผ ํ•จ๊ป˜ ์š”์ฒญ์„ ๋ณด๋ƒˆ๋‹ค.
  2. ์„œ๋ฒ„์—์„œ ํ† ํฐ์ด ํ•„์š”ํ•œ ์š”์ฒญ์ž„์„ ์ธ์ง€ํ•˜๊ณ  ํ† ํฐ์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”๋ฐ ํ† ํฐ์ด ์—†๋‹ค.
  3. ํ† ํฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ํ† ํฐ ์ž์ฒด๊ฐ€ ์—†์œผ๋ฉด JwtAuthenticationEntryPoint์—์„œ /exception/entry-point๋กœ "GET" ๋ฉ”์†Œ๋“œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜๊ณ  ExceptionController์—์„œ ์ด URI๋ž‘ ๋งคํ•‘๋œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์„œ Response์— ์—๋Ÿฌ๋ฅผ ๋‹ด์•„ ๋ฆฌํ„ดํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๋”ฐ.
  4.  /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์„ ์ž˜ ๋‹ด์•„ ์ฃผ์—ˆ๋Š”๋ฐ ์‹ค์ œ๋กœ ์š”์ฒญ ํ—ค๋”๋ฅผ ๋ณด๋ฉด ์–ด๋Š ํ† ํฐํ•˜๋‚˜ ๋‹ด๊ฒจ์žˆ์ง€ ์•Š์•˜๋‹ค. ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋‹ˆ ๋‚˜์™€ ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช์€ ๋ถ„์˜ ๊ธ€์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.
 

axios ์š”์ฒญ์‹œ header์— ํ† ํฐ์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ(feat. ์•ฝ 5์‹œ๊ฐ„ ์‚ฝ์งˆ)

ํŒ€์› ํ•œ๋ถ„์€ ๋ด‰์‚ฌ ์ทจ์†Œ๊ธฐ๋Šฅ ์„, ๋‹ค๋ฅธ ํ•œ๋ถ„์€ ๋ด‰์‚ฌ ์‹ ์ฒญ๊ธฐ๋Šฅ ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋„์ค‘์— ์ผ์–ด๋‚œ ์ผ์ด๋‹ค.๋งŒ๋“ค์–ด์ง„ api๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋‘๋ถ„ ๋‹ค ๋˜‘๊ฐ™์€ 302 ์—๋Ÿฌ๊ฐ€ ๋œจ๋ฉฐ ์ž๊พธ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์œผ๋กœ redirect ๋˜๋Š”

velog.io

 
๊ธ€์„ ์ฝ์–ด๋ณด๋ฉด ๋‚˜์™€ ๋งค์šฐ๋งค์šฐ๋งค์šฐ ๋น„์Šทํ•œ ๋งฅ๋ฝ์—์„œ์˜ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ๊ณ„์…จ๋‹ค. ์‹ฌ์ง€์–ด ๋˜ ์‹œ๋„ํ•ด๋ณธ ํ•ด๊ฒฐ๊ณผ์ •๋“ค์ด ๋‚˜์™€ ์ •ํ™•ํžˆ ๊ฐ™์•˜๋‹ค.
์•„๋งˆ ์ด ๊ธ€์„ ๋ชป๋ดค๋‹ค๋ฉด ์•„์ง๋„ CORS์ด๋‹ˆ ํ•„ํ„ฐ ๋ฌธ์ œ๋‹ˆ ์‹œํ๋ฆฌํ‹ฐ ๋ฌธ์ œ๋‹ˆ ํ•˜๋ฉฐ ์‚ฝ์งˆํ–ˆ์„ ๊ฒƒ์ด๋‹ค.
 
๊ฒฐ๋ก ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋ญ์˜€๋ƒ๋ฉด ํ”„๋ก ํŠธ์—์„œ body์— ์•„๋ฌด๋Ÿฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— token์ด ์„œ๋ฒ„์— ์ „์†ก๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด๋‹ค.

์•„์˜ค

API์˜ ์š”์ฒญ body์— ์™œ ์•„๋ฌด๋ฐ์ดํ„ฐ๋„ ์—†๋ƒ๋ฉด ์ด API๋Š” id ๊ฐ’๋งŒ ๋ณด๋‚ด๋ฉด ํ•ด๋‹น Trade์˜ ID๊ฐ’์„ ์ฐพ์•„ ์ปฌ๋Ÿผ๊ฐ’๋งŒ ์Šค์œ„์นญํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด์˜€๋Š”๋ฐ, axios๋Š” ์•„๋ฌด๋Ÿฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์„ ๋• null๊ฐ’์ด๋ผ๋„ ๋„˜๊ฒจ์•ผ ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค;;; axios์— null์„ ๋‹ด์•„ ๋ณด๋‚ด์ฃผ๋‹ˆ ์ž˜ ์ž‘๋™ํ•˜๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 
์—ฌ์ฐจ์ €์ฐจ ํ•ด๊ฒฐ์€ ํ–ˆ๋Š”๋ฐ, ์ด์ •๋„๋กœ ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ์‚ฝ์งˆ์„ ๋งŽ์ดํ•œ๊ฑด ์ด๋ฒˆ์ด ์ฒ˜์Œ์ธ๊ฒƒ ๊ฐ™๋‹ค.
 
์•„ ๊ทธ๋ฆฌ๊ณ  ์•„์ง ์ฐ์ฐํ•œ ๋ถ€๋ถ„์ด ํ•˜๋‚˜ ๋‚จ์•˜๋‹ค. /exception/entry-point๋กœ "GET"์ด ์•„๋‹Œ "PATCH"๋กœ ์š”์ฒญ์„ ํ•ด์„œ ๊ดœํžˆ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ƒ๋Š” ๊ฒƒ์ด๋‹ค.
 
๋‚ด ์ƒ๊ฐ์ด๊ฑด๋ฐ, Body์— ์•„๋ฌด๋Ÿฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ๋Š” ํ”„๋ก ํŠธ์—์„œ null์ด๋ผ๋„ ๋‹ด์•„ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค ๋ณด๋‹ˆ body ์ž์ฒด๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ฒŒ ๋˜๊ณ , ์ด ๊ณผ์ •์—์„œ ํ† ํฐ๋„ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋‹ค๋ณด๋‹ˆ ์—ฌ๋Ÿฌ์—ฌ๋Ÿฌ ์ƒํ™ฉ์ด ๊ฒน์ณ์„œ ์ตœ์ดˆ ์š”์ฒญ ๋ฉ”์†Œ๋“œ์˜€๋˜ PATCH๊ฐ€ ๊ทธ๋Œ€๋กœ Redirection์— ํ˜๋Ÿฌ ๋“ค์–ด๊ฐ„ ๊ฒƒ ๊ฐ™๋‹ค. ํ•œ๋งˆ๋””๋กœ ๋ฒ„๊ทธ

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ