신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

첫번째, 403에러 발생

 

나무 위키

https://namu.wiki/w/403%20Forbidden

 

403 Forbidden - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다. 나무위키는 백과사전이 아니며 검증되지 않았거나, 편향적이거나, 잘못된 서술이 있을 수 있습니다. 나무위키는 위키위키입니다. 여러분이 직접 문서를 고칠 수 있으며, 다른 사람의 의견을 원할 경우 직접 토론을 발제할 수 있습니다.

namu.wiki

 

위키 백과

https://ko.wikipedia.org/wiki/HTTP_403

 

HTTP 403 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

에러에 대한 자세한 내용은 위 두 링크를 확인 하세요

이 글에서는 스프링에서 해결방법에 대해 다루겠습니다.

 

 

스프링 프로젝트를 진행하면서,

시큐리티 문제로 403 에러가 발생한다면

주로 csrf 토큰 문제일것이다.

 

해결방법에는 2가지가 있다.

토큰을 서버로 보내준다.

csrf를 사용하지 않는다.

 

1. 로그인할때 csrf 토큰을 서버로 같이 보내주는 방법

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    <!-- csrf 토큰 -->
    <meta id="_csrf" name="_csrf" content="${_csrf.token}" />
    <meta id="_csrf_header" name="_csrf_header" content="${_csrf.headerName}" />
    
    <title>로그인 페이지</title>
</head>
<body>
    <h1>loginForm</h1>
    
    <form action="<c:url value="/j_spring_security_check" />" method="post">
        <!-- csrf 토큰을 로그인 정보와 같이 보내준다. -->
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
        
        ID : <input type="text" name="username"/><br>
        Password : <input type="password" name="password"/><br>
        <input type="submit" value="login" />
    </form>
</body>
</html>
​

10, 11번째 줄 코드와 20번째 줄 코드를 확인한다.

csrf 토큰을 로그인할때 같이 넘겨주면 된다.

 

2. csrf를 사용하지 않는 방법

<security:http auto-config="true" use-expressions="true">
    <security:csrf disabled="true"/>
    <!--
        ...
        ...    
        생략
        ...
        ...
    -->
</security:http>
​

 

context.xml 파일을 수정하면 된다.

 

http태그 안에 csrf 태그를 넣어준다.

이때, 속성값 disabled="true"를 넣어준다.

 

 


두번째, 500 에러 발생

There is no PasswordEncoder mapped for the id "null"

 

위와 같은 멘트와 함께 에러가 발생한다..

 

 

스프링 시큐리티 5 버전으로 넘어오면서

passwordEncoder라는 것이 생겼다.

 

기존에는 

<security:authentication-manager>
    <security:authentication-provider>
        <security:user-service>
            <security:user name="admin" password="123" authorities="ROLE_ADMIN"/>
            <security:user name="user" password="123" authorities="ROLE_USER"/>
        </security:user-service>
    </security:authentication-provider>
</security:authentication-manager>
​

 

위와 같이 했지만, 시큐리티 5부터는

id값을 붙여줘야한다.

 

{id값}password

 

 

 

만약 id값을 사용하기 싫다면

noop을 입력해주면 된다.

 

스프링에서는 공공사이트, 즉 실제로 사이트를 운영한다면 noop을 이용하면

보안이 취약해서 추천하지 않는다.

 

 

일단 테스트 목적으로 noop을 사용하여, 위와 같이 변경한다면..

<security:authentication-manager>
    <security:authentication-provider>
        <security:user-service>
            <security:user name="admin" password="{noop}123" authorities="ROLE_ADMIN"/>
            <security:user name="user" password="{noop}123" authorities="ROLE_USER"/>
        </security:user-service>
    </security:authentication-provider>
</security:authentication-manager>
​

 

{noop}password

라고 바꿔주면 된다.

 

이제 실행해보면 정상적으로 로그인이 되는것을 확인 할 수 있다.

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기