λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Spring/Spring Security

Spring Security - CSRF(Cross-Site Request Forgery)

by 주발2 2021. 5. 26.
λ°˜μ‘ν˜•

 μ•ˆλ…•ν•˜μ„Έμš”~ 이전에 μš΄μ˜ν•˜λ˜ λΈ”λ‘œκ·Έ 및 GitHub, 곡뢀 λ‚΄μš©μ„ μ •λ¦¬ν•˜λŠ” Study-GitHub κ°€ μžˆμŠ΅λ‹ˆλ‹€!

 λ„€μ΄λ²„ λΈ”λ‘œκ·Έ

 GitHub

Study-GitHub

 πŸ”


 

πŸ“Ž  CSRF(Cross-Site Request Forgery)

μ•ˆλ…•ν•˜μ„Έμš”, μ΄λ²ˆμ— 정리할 λ‚΄μš©μ€ CSRF(Cross-Site Request Forgery) μž…λ‹ˆλ‹€!

 

μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°μ˜ μ–΄λ…Έν…Œμ΄μ…˜μΈ @EnableWebSecurity μ–΄λ…Έν…Œμ΄μ…˜μ€ 기본적으둜 CSRF 곡격을 λ°©μ§€ν•˜λŠ” κΈ°λŠ₯을 μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ‹œνλ¦¬ν‹°λ₯Ό μ μš©ν•˜λ©΄ 보톡 configure() λ©”μ„œλ“œμ—λŠ” μ•„λž˜μ™€ 같이 csrf().disable()둜 μ μš©μ„ ν•˜λŠ”λ°μš”,

μ΄λŸ¬ν•œ CSRFλž€ 무엇인지 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€! πŸ˜ƒ

 

 

 

 

🎯  CSRFλž€?

μ‚¬μ΄νŠΈ κ°„ μš”μ²­ μœ„μ‘°(Cross-Site Request Forgery)

좜처: https://rusyasoft.github.io/java/2019/02/15/spring-security-csrf-from-context/

CSRFλž€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 취약점 쀑 ν•˜λ‚˜λ‘œ, μ΄μš©μžκ°€ μ˜λ„ν•˜μ§€ μ•Šμ€ μš”μ²­μ„ ν†΅ν•œ 곡격을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

즉 CSRF κ³΅κ²©μ΄λž€, 인터넷 μ‚¬μš©μž(ν¬μƒμž)κ°€ μžμ‹ μ˜ μ˜μ§€μ™€λŠ” λ¬΄κ΄€ν•˜κ²Œ κ³΅κ²©μžκ°€ μ˜λ„ν•œ ν–‰μœ„(등둝, μˆ˜μ •, μ‚­μ œ λ“±)λ₯Ό νŠΉμ • μ›Ήμ‚¬μ΄νŠΈμ— μš”μ²­ν•˜λ„λ‘ λ§Œλ“œλŠ” 곡격 μž…λ‹ˆλ‹€.

 

β€» 2008년에 λ°œμƒν–ˆλ˜ μ˜₯μ…˜μ˜ κ°œμΈμ •λ³΄ 유좜 μ‚¬κ±΄μ—μ„œλ„ κ΄€λ¦¬μž 계정을 νƒˆμ·¨ν•˜λŠ”λ° 이 CSRF 방법이 μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

🎯  CSRF의 곡격 방법

CSRF의 곡격은 μ—¬λŸ¬ 방식이 μ‘΄μž¬ν•˜λŠ”λ°μš”, λŒ€ν‘œμ μœΌλ‘œ GET / POST λ₯Ό ν†΅ν•œ 곡격에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

GET Examples

GET http://bank.com/trasnfer?accountNumber=1122&amount=10000

μœ„ μ˜ˆμ‹œλŠ” λ‘œκ·ΈμΈμ„ ν•œ μ‚¬μš©μžκ°€ νŠΉμ • κ³„μ’Œ("1122")둜 κΈˆμ•‘(10000)을 μ΄μ²΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” GET μš”μ²­μž…λ‹ˆλ‹€.

μœ„μ˜ URLμ—μ„œ κ³΅κ²©μžκ°€ μžμ‹ μ˜ κ³„μ’Œ("5678")으둜 κΈˆμ•‘(10000)을 이체 ν•˜λ„λ‘ ν•˜λ €λ©΄ ν”Όν•΄μžκ°€ μš”μ²­μ„ trigger ν•˜λ„λ‘ ν•΄μ•Όν•©λ‹ˆλ‹€.

 

 

GET http://bank.com/trasnfer?accountNumber=5678&amount=10000

κ³΅κ²©μžκ°€ μœ„μ™€ 같은 상황을 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” μ—¬λŸ¬ 방식이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

 

  • Link(링크): κ³΅κ²©μžλŠ” 이체λ₯Ό μ‹€ν–‰ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©μž(ν¬μƒμž)κ°€ 링크λ₯Ό ν΄λ¦­ν•˜λ„λ‘ μœ λ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
<a href="http://bank.com/transfer?accountNumber=5678&amount=10000">
Pictures@
</a>

 

 

  • Image(이미지): κ³΅κ²©μžλŠ” λŒ€μƒ URLκ³Ό ν•¨κ»˜ <img />νƒœκ·Έλ₯Ό 이미지 μ†ŒμŠ€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ‚¬μš©μžλŠ” λ”°λ‘œ 클릭이 ν•„μš”ν•˜μ§€κ°€ μ•ŠλŠ”λ°μš”, νŽ˜μ΄μ§€κ°€ λ‘œλ“œλ˜λ©΄ μš”μ²­μ€ μžλ™μ μœΌλ‘œ 싀행이 λ©λ‹ˆλ‹€.
<img src="http://bank.com/transfer?accountNumber=5678&amount=10000"/>

 

 

 

 

POST Example

μœ„μ—μ„œ GET λ°©μ‹μ˜ 예제λ₯Ό λ“€μ–΄λ³΄μ•˜λŠ”λ°μš”, μ΄λ²ˆμ—λŠ” POST 예제λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

POST http://bank.com/transfer
accountNumber=1122&amount=10000

 

 

μœ„μ™€ 같이 POST μš”μ²­μ—μ„œ κ³΅κ²©μžλŠ” ν”Όν•΄μžκ°€ λ‹€μŒκ³Ό 같이 μ‹€ν–‰λ˜λ„λ‘ ν•΄μ•Όν•©λ‹ˆλ‹€.

POST http://bank.com/transfer
accountNumber=5678&amount=10000

 

 

μœ„μ™€ 같은 κ²½μš°μ—λŠ” <a> νƒœκ·Έλ‚˜ <img /> νƒœκ·Έ λͺ¨λ‘ λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ κ³΅κ²©μžλŠ” λ‹€μŒκ³Ό 같이 <form> νƒœκ·Έκ°€ ν•„μš”ν•œλ°μš”,

<form action="http://bank.com/transfer" method="POST">
    <input type="hidden" name="accountNumber" value="5678"/>
    <input type="hidden" name="amount" value="10000"/>
    <input type="submit" value="Pictures@"/>
</form>

 

 

ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 양식을 μžλ™μœΌλ‘œ 전솑(submit) ν•˜λ„λ‘ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<body onload="document.forms[0].submit()">

<form>

...

 

 

 

 

🎯  CSRF λ°©μ–΄ 방법

μœ„μ—μ„œ CSRF에 λŒ€ν•œ κ°œλ… 및 곡격 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

Spring의 곡식 λ¬Έμ„œμ—μ„œλŠ” λ‹€μŒκ³Ό 같이 언급이 λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

When to use CSRF protection

Our recommendation is to use CSRF protection for any request that could be processed by a browser by normal users. If you are only creating a service that is used by non-browser clients, you will likely want to disable CSRF protection.

-> 일반 μ‚¬μš©μžκ°€ λΈŒλΌμš°μ €λ₯Ό 톡해 μ²˜λ¦¬ν•  수 μžˆλŠ” λͺ¨λ“  μš”μ²­μ— λŒ€ν•΄ CSRF 보호λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.
λ§Œμ•½, λΈŒλΌμš°μ €κ°€ μ•„λ‹Œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‚¬μš©ν•˜λŠ” μ„œλΉ„μŠ€λ§Œ μƒμ„±ν•˜λŠ” 경우 CSRF 보호λ₯Ό λΉ„ν™œμ„±ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

μ΄λŸ¬ν•œ CSRF 곡격을 λ°©μ–΄ν•˜κΈ° μœ„ν•΄ λŒ€ν‘œμ μœΌλ‘œ λ‹€μŒκ³Ό 같은 방법듀이 μžˆμŠ΅λ‹ˆλ‹€.

  • Referrer 검증
  • Spring Security CSRF Token μ‚¬μš©

 

보톡 CSRF 곡격의 λ°©μ–΄λŠ” 쑰회(GET) λ°μ΄ν„°λŠ” λ°©μ–΄ λŒ€μƒμ— 두지 μ•Šκ³  POST, PATCH, DELETE λ©”μ„œλ“œμ—λ§Œ μ μš©μ„ ν•©λ‹ˆλ‹€.

(λ¬Όλ‘  정말 μ€‘μš”ν•œ 데이터λ₯Ό μ‘°νšŒν• λ•ŒλŠ” GET λ©”μ„œλ“œμ—λ„ λ°©μ–΄λ₯Ό ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.)

 

 

Referrer 검증

μ„œλ²„λ‹¨μ—μ„œ request의 referrer을 ν™•μΈν•˜μ—¬ domain이 μΌμΉ˜ν•˜λŠ”μ§€ κ²€μ¦ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

referrer κ²€μ¦λ§ŒμœΌλ‘œ λŒ€λΆ€λΆ„μ˜ CSRF 곡격을 λ°©μ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

Spring Security CSRF Token

μž„μ˜μ˜ 토큰을 λ°œκΈ‰ν•œ ν›„ μžμ›μ— λŒ€ν•œ λ³€κ²½ μš”μ²­μΌ 경우 Token 값을 ν™•μΈν•œ ν›„ ν΄λΌμ΄μ–ΈνŠΈκ°€ 정상적인 μš”μ²­μ„ 보낸것인지 ν™•μΈν•©λ‹ˆλ‹€.

λ§Œμ•½ CSRF Token이 μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜, 기쑴의 Tokenκ³Ό μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” 경우 4XX μƒνƒœμ½”λ“œλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

β€» νƒ€μž„λ¦¬ν”„ ν…œν”Œλ¦Ώ 및 jsp의 spring:form νƒœκ·Έλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ 기본적으둜 csrf token을 λ„£μ–΄μ€λ‹ˆλ‹€.

 

μš”μ²­ν•œ νŒŒλΌλ―Έν„°μ— Token을 ν¬ν•¨ν•œ λ’€ μ „μ†‘ν•˜μ—¬ 정상적인 μš”μ²­μΈμ§€ ν˜Ήμ€ κ³΅κ²©μžλ‘œλΆ€ν„° μ˜λ„λœ μš”μ²­μΈμ§€ νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

Spring Securityμ—μ„œλŠ” @EnableWebSecurity μ–΄λ…Έν…Œμ΄μ…˜μ„ 지정할 경우 μžλ™μœΌλ‘œ CSRF 보호 κΈ°λŠ₯이 ν™œμ„±ν™”κ°€ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ CSRF λΉ„ν™œμ„±ν™”κ°€ ν•„μš”ν•  경우 μ•„λž˜μ™€ 같이 csrf().disable() 섀정을 μΆ”κ°€ν•©λ‹ˆλ‹€.

 

 

CSRF λ³΄ν˜ΈλŠ” 데이터 λ³€μ‘°κ°€ κ°€λŠ₯ν•œ POST, PUT λ“±μ˜ method 에 μ μš©ν•©λ‹ˆλ‹€.

csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())λ₯Ό μ‚¬μš©ν•˜μ—¬ CSRF Token을 μ§€μ •ν•©λ‹ˆλ‹€.

 

 

csrfTokenRepository()

csrfTokenRepository λ©”μ„œλ“œμ˜ νŒŒλΌλ―Έν„°λŠ” CsrfTokenRepository μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ°›κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œ λ©”μ„œλ“œμ— λ“€μ–΄κ°ˆ κ΅¬ν˜„μ²΄λŠ” CookieCsrfTokenRepository μž…λ‹ˆλ‹€.

 

 

CookieCsrfTokenRepository의 κ³΅μ‹λ¬Έμ„œμ—λŠ” λ‹€μŒκ³Ό 같이 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

A CsrfTokenRepository that persists the CSRF token in a cookie named "XSRF-TOKEN" and reads from the header "X-XSRF-TOKEN" following the conventions of AngularJS. When using with AngularJS be sure to use withHttpOnlyFalse().

-> CsrfTokenRepositoryλŠ” "XSRF-TOKEN"μ΄λΌλŠ” μ΄λ¦„μ˜ μΏ ν‚€μ—μ„œ CSRF 토큰을 μœ μ§€ν•˜κ³ , AngularJS의 κ·œμ•½μ„ λ”°λ₯΄λŠ” 헀더인 "X-XSRF-TOKEN"μ—μ„œ μ½μŠ΅λ‹ˆλ‹€. AngularJS와 ν•¨κ»˜ μ‚¬μš©ν•  경우 withHttpOnlyFalse()와 ν•¨κ»˜ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

 

CookieCsrfTokenRepository

CookieCsrfTokenRepository 클래슀 λ‚΄λΆ€λ₯Ό 확인해보면 μΏ ν‚€ λ„€μž„, νŒŒλΌλ―Έν„° λ„€μž„, 헀더 λ„€μž„μ΄ λ””ν΄νŠΈλ‘œ μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • DEFAULT_CSRF_COOKIE_NAME = "XSRF-TOKEN";
  • DEFAULT_CSRF_PARAMETER_NAME = "_csrf";
  • DEFAULT_CSRF_HEADER_NAME = "X-XSRF-TOKEN";

 

withHttpOnlyFalse() λ©”μ„œλ“œλ₯Ό 톡해 cookieHttpOnly 의 값은 false둜 섀정이 λ˜λŠ”λ°μš”, 

HttpOnly CookieλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

An HttpOnly Cookie is a tag added to a browser cookie that prevents client-side scripts from accessing data. It provides a gate that prevents the specialized cookie from being accessed by anything other than the server.  Using the HttpOnly tag when generating a cookie helps mitigate the risk of client-side scripts accessing the protected cookie, thus making these cookies more secure.

-> Http Only CookieλŠ” ν΄λΌμ΄μ–ΈνŠΈμΈ‘ μŠ€ν¬λ¦½νŠΈκ°€ 데이터에 μ ‘κ·Όν•˜λŠ” 것을 λ°©μ§€ν•˜λŠ” λΈŒλΌμš°μ € 쿠킀에 μΆ”κ°€λœ νƒœκ·Έμž…λ‹ˆλ‹€.
μ΄λŠ” μ„œλ²„ μ΄μ™Έμ˜ λ‹€λ₯Έ μ‚¬μš©μžκ°€ 특수 쿠킀에 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 ν•˜λŠ” 게이트λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
μΏ ν‚€λ₯Ό 생성할 λ•Œ HttpOnly νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μŠ€ν¬λ¦½νŠΈκ°€ 보호된 쿠킀에 μ•‘μ„ΈμŠ€ν•˜λŠ” μœ„ν—˜μ„ 쀄일 수 μžˆμœΌλ―€λ‘œ μΏ ν‚€μ˜ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

🎯  CSRF  ν…ŒμŠ€νŠΈ

μœ„μ—μ„œ μž‘μ„±ν•œ μ„€μ • 및 μ½”λ“œλ₯Ό 톡해 κ°„λ‹¨ν•˜κ²Œ ν…ŒμŠ€νŠΈλ₯Ό 진행해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

// Controller
package com.example.securitycsrf.csrf;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RequestMapping("/csrf")
@RestController
public class CsrfController {

    @GetMapping
    public void csrfGet() {
        log.info("GET");
    }

    @PostMapping
    public void csrfPost() {
        log.info("POST");
    }
}



// Spring Security Config
package com.example.securitycsrf.csrf;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}


 

 

 

GET 호좜

μ„€μ •μ—μ„œ csrfTokenRepository()λ₯Ό μ„€μ •ν•˜κ³  GET λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄λ³΄λ©΄ μœ„μ™€ 같이 μΏ ν‚€ 정보λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

(기본적으둜 GET 방식은 CSRF Token 정보λ₯Ό λ„˜κΈ°μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.)

 

 

 

 

POST 호좜

GET μš”μ²­μ„ 톡해 받은 쿠킀값을 Header에 μ„€μ •ν•΄μ„œ POST ν˜ΈμΆœμ„ μ‹œλ„ν•˜λ©΄ μ •μƒμ μœΌλ‘œ 200 OKλ₯Ό λ„˜κ²¨λ°›μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

(μœ„ CookieCsrfTokenRepository 클래슀의 HEADER_NAME의 λ””ν΄νŠΈ 값이 X-XSRF-TOKEN μž…λ‹ˆλ‹€.)

 

 

λ§Œμ•½ 기쑴의 Tokenκ³Ό λ‹€λ₯Έ 값을 μ„€μ •ν•˜λ©΄ μœ„μ™€ 같이 403 Forbidden 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

 

 

 

🎯  μ™œ CSRF에 λŒ€ν•΄ λΉ„ν™œμ„±ν™”ν• κΉŒμš”?

CSRF(Cross-Site Request Forgery)λŠ” "μ‚¬μ΄νŠΈ κ°„ μš”μ²­"이 λ°œμƒν•˜κΈ° μ‰¬μš΄ 웹에 λŒ€ν•΄ μš”μ²­ν•  λ•Œ ν•„μš”ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 보톡 ν…œν”Œλ¦Ώ 엔진(Thymeleaf, JSP)등을 μ‚¬μš©ν•˜μ—¬ μ„œλ²„ μΈ‘μ—μ„œ 전체 HTML을 μƒμ„±ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ΅œμ‹ μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 주둜 REST API의 μ•€λ“œν¬μΈνŠΈμ— μ˜μ‘΄ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ•€λ“œν¬μΈνŠΈλŠ” λŒ€λΆ€λΆ„ JSON λ°©μ‹μœΌλ‘œ 톡신을 ν•˜λ„λ‘ 섀계가 λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

REST APIλŠ” HTTP ν˜•μ‹μ„ λ”°λ₯΄κΈ° λ•Œλ¬Έμ— λ¬΄μƒνƒœ(stateless)이며 μ„œλ²„μͺ½μ˜ μ„Έμ…˜μ΄λ‚˜ λΈŒλΌμš°μ € 쿠킀에 μ˜μ‘΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

CSRF μ„€λͺ…에 λ”°λ₯΄λ©΄, μœ„μ™€ 같은 REST API의 쑰건(μΏ ν‚€ 기반의 μ„Έμ…˜ 처리)μ—λŠ” 더 이상 CSRF이 관련이 μ—†μœΌλ―€λ‘œ

μ΄λŸ¬ν•œ APIλŠ” CSRF 곡격을 받을 κ°€λŠ₯성이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

λ”°λΌμ„œ λŒ€λΆ€λΆ„μ˜ ν˜„μž¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(API만 λ…ΈμΆœν•˜λŠ”)의 경우 μ•€λ“œν¬μΈνŠΈμ— λŒ€ν•΄ CSRFλ₯Ό λΉ„ν™œμ„±ν™”ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

References

 

λ°˜μ‘ν˜•

λŒ“κΈ€