[SpringBoot] 하나의 form을 재활용 하기 위한 방법 (ex_등록,수정을 하나의 form으로 <csrf>)

2023. 3. 31. 14:30spring

게시판 중 게시글 수정을 구현하고 있었다.

기존에는 수정을 위한 form을 새로 만들었는데 의미없는 중복 코드가 발생함을 느꼈다.

방법이 없을까 하고 찾아보니 역시 있었다.

 

간단하게 예를 들어보았다. 참고로 타임리프와 spring security를 사용한다.

 

<form th:object="${questionForm}" method="post">
        <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
        <div class="mb-3">
            <label for="subject" class="form-label">제목</label>
            <input type="text" th:field="*{subject}" class="form-control">
        </div>
        <div class="mb-3">
            <label for="content" class="form-label">내용</label>
            <textarea th:field="*{content}" class="form-control" rows="10"></textarea>
        </div>
        <input type="submit" value="저장하기" class="btn btn-primary my-2">
    </form>

 

- action 속성을 삭제하고 CSRF 값을 설정하기 위한 hidden 형태의 input 엘리먼트를 수동으로 추가한다.

- 스프링 시큐리티의 규칙에 따라 CSRF 값을 수동으로 추가하기 위해서는 다음과 같이 해야 한다.

- action 속성 없이 폼을 전송하면 현재의 URL을 기준으로 전송이 된다.

- 즉, 질문 등록시에 브라우저에 표시되는 URL은 /question/add이기 때문에 POST로 폼 전송시 action 속성에 /question/add가 설정이 되고, 질문 수정시에 URL은 /question/modify/2 형태의 URL이기 때문에 POST로 폼 전송시 action 속성에 /question/modify/2 형태의 URL이 설정이 된다.