복붙노트

[SPRING] 403 금지 된 오류 아약스 GET 요청 봄

SPRING

403 금지 된 오류 아약스 GET 요청 봄

데이터베이스에서 사용자 정보를 가져올 때마다 403 금지 된 오류가 발생합니다. 아래의 코드와 관련하여 Ajax 테스트 버튼을 눌러 요청을 시도 할 때마다 실행이 실패하고 경고 메시지가 표시되지만 콘솔에서도 403 Forbidden-error가 발생합니다. Spring 보안과 관련이 있는지 확실하지 않습니다.

사용자 JSP 페이지 :

<table>
    <tr>
        <td>User Id</td>
        <td>Full Name</td>
        <td>Username</td>
        <td>Email</td>
        <td>Date of Birth</td>
        <td>User Authority</td>
        <td>Update </td>
        <td>Delete</td>
    </tr>
    <c:forEach var="user" items="${users}">
        <tr>
            <td><c:out value="${user.id}" /></td>
            <td><c:out value="${user.name}"/></td>
            <td><c:out value="${user.username}"/></td>
            <td><c:out value="${user.email}"/></td>
            <td><c:out value="${user.dob}"/></td>
            <td><c:out value="${user.authority}"/></td>
            <td>
                <a id="update" href="<c:url value="/viewUser"><c:param name="id" value="${user.id}"/></c:url>"><button>Update</button></a>
            </td>
            <td>
                <a id="delete" href="<c:url value="/deleteUser"><c:param name="id" value="${user.id}"/></c:url>"><button>Delete</button></a>
            </td>
            <td>
                <button class="loadUser" name="id" value="${user.id}">Ajax test</button>
            </td>
        </tr>
    </c:forEach>
</table>
 <div id="personIdResponse"> </div>
<script type="text/javascript">
    $(document).ready(function(){
        $(".loadUser").click(function(e) {
            e.preventDefault();
            var personId = +$(this).val();
            $.get('${pageContext.request.contextPath}/SDP/ajaxTest/' + personId, function(user) {
                  $('#personIdResponse').text(user.name + ', = username ' + user.username);
                })
            .fail(function(user){
                alert('Could not load user');
            });
        });
    });
</script>

사용자 컨트롤러 클래스 :

    @RequestMapping("/viewUser")
public String updateUser(Model model, @RequestParam(value = "id", required = false) Integer id) {

    User user = usersService.getUser(id);

    model.addAttribute("user", user);

    return "settings";
}

@RequestMapping("/ajaxTest")
@ResponseBody
public User ajaxTest(@RequestParam(value = "id", required = false) Integer id) {

    User user = usersService.getUser(id); 
    return user;
}

해결법

  1. ==============================

    1.대개 Spring의 CSRF 보호 기능으로 인해 발생합니다.

    대개 Spring의 CSRF 보호 기능으로 인해 발생합니다.

    예를 들어 JS 코드에서 DELETE HTTP 요청을 사용하는 경우 CSRF 보호 헤더도 보내야합니다.

    CSRF 보호를 비활성화 할 필요는 없습니다! 필요하지 않다면 그렇게하지 마십시오.

    CSRF AJAX / REST 보호 기능을 다음과 같이 손쉽게 추가 할 수 있습니다.

    1. 모든 페이지에 메타 헤더 추가 (@ layout.html 등 사용) :

    <head>
      <meta name="_csrf" th:content="${_csrf.token}"/>
      <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
    </head>
    

    2. 요청에 따라 다음 헤더를 보낸다.

    $(function () {
      var token = $("meta[name='_csrf']").attr("content");
      var header = $("meta[name='_csrf_header']").attr("content");
      $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
      });
    });
    

    thymeleaf를 사용하므로 content 속성 대신 : content를 사용합니다.

  2. ==============================

    2.Spring Security 3.2R1 이상을 사용하는 경우이 솔루션을 사용해보십시오 http://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection

    Spring Security 3.2R1 이상을 사용하는 경우이 솔루션을 사용해보십시오 http://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection

  3. ==============================

    3.스프링 시큐리티 4.0부터 CSRF 보호는 기본적으로 XML 설정으로 가능합니다. CSRF 보호를 비활성화하려면 해당 XML 구성을 아래에 표시하십시오.

    스프링 시큐리티 4.0부터 CSRF 보호는 기본적으로 XML 설정으로 가능합니다. CSRF 보호를 비활성화하려면 해당 XML 구성을 아래에 표시하십시오.

    <security:http use-expressions="true">
               ...
       <security:csrf disabled="true" />
    </security:http>
    
  4. ==============================

    4.파일 사용 권한을 확인하십시오. 403은 Ajax가 아닌 서버 오류입니다. 요청한 파일 (파일을 통해 URL을 의미 함)을 직접 확인하십시오.

    파일 사용 권한을 확인하십시오. 403은 Ajax가 아닌 서버 오류입니다. 요청한 파일 (파일을 통해 URL을 의미 함)을 직접 확인하십시오.

  5. ==============================

    5.Spring Rest 나 Jersey 같은 다른 REST 구현에서 서버 측에서 일치하는 리소스가 없다면 403 Forbidden이 REST 컨테이너에 의해 던져진다.

    Spring Rest 나 Jersey 같은 다른 REST 구현에서 서버 측에서 일치하는 리소스가 없다면 403 Forbidden이 REST 컨테이너에 의해 던져진다.

    req-response 주석을 다시 확인해야합니다.

    예를 들어 ajaxTest 요청의 경우 다음과 같이 변경하십시오.

    @RequestMapping("/ajaxTest/{personid}", method=RequestMethod.GET)
    @ResponseBody
    public User ajaxTest(@PathVariable Integer personid) { .. }
    

    기본적으로 person-id는 GET URL에서 설정 한 요청 매개 변수처럼 보이지 않으므로 PathVariable로 변경하고 Spring REST의 기본 메소드에 대해 확실하지 않은 경우이 메소드가 가져올 HTTP 메소드에 대해 명시 적으로 정의하십시오 호출됩니다.

    403에서는 작동이 허용되지 않거나 인증 실패와 다른 많은 이유가 있음을 나타냅니다. 다양한 가능성에 대해 http://en.wikipedia.org/wiki/HTTP_403을 확인하십시오.

  6. from https://stackoverflow.com/questions/19091206/403-forbidden-error-with-ajax-get-request-spring by cc-by-sa and MIT license