coding/asp.net

@Html.AntiForgeryToken();

사과키라임파이 2022. 4. 22. 17:40

@Html.AntiForgeryToken();

 

위조방지토큰

form에서는 @Html.AntiForgeryToken(); 사용,

 

CSHTML복사
@using (Html.BeginForm("Manage", "Account")) {
    @Html.AntiForgeryToken()
}

CSRF 및 AJAX 방지

AJAX 요청이 HTML 양식 데이터가 아닌 JSON 데이터를 보낼 수 있으므로 양식 토큰은 AJAX 요청에 문제가 될 수 있습니다. 한 가지 솔루션은 사용자 지정 HTTP 헤더에 토큰을 보내는 것입니다. 다음 코드는 Razor 구문을 사용하여 토큰을 생성한 다음 AJAX 요청에 토큰을 추가합니다. 토큰은 AntiForgery.GetTokens를 호출하여 서버에서 생성됩니다.

HTML복사
<script>
    @functions{
        public string TokenHeaderValue()
        {
            string cookieToken, formToken;
            AntiForgery.GetTokens(null, out cookieToken, out formToken);
            return cookieToken + ":" + formToken;                
        }
    }

    $.ajax("api/values", {
        type: "post",
        contentType: "application/json",
        data: {  }, // JSON data goes here
        dataType: "json",
        headers: {
            'RequestVerificationToken': '@TokenHeaderValue()'
        }
    });
</script>

요청을 처리하는 경우 요청 헤더에서 토큰을 추출합니다. 그런 다음 AntiForgery.Validate 메서드를 호출하여 토큰의 유효성을 검사합니다. 토큰이 유효하지 않으면 Validate 메서드가 예외를 throw합니다.

C#복사
void ValidateRequestHeader(HttpRequestMessage request)
{
    string cookieToken = "";
    string formToken = "";

    IEnumerable<string> tokenHeaders;
    if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
    {
        string[] tokens = tokenHeaders.First().Split(':');
        if (tokens.Length == 2)
        {
            cookieToken = tokens[0].Trim();
            formToken = tokens[1].Trim();
        }
    }
    AntiForgery.Validate(cookieToken, formToken);
}

https://docs.microsoft.com/ko-kr/aspnet/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks