본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 81일차 스프링, MySQL 이어서 (1) (게시물 작성 시 Spring Security)

이어서 진행하는데, 로그인을 하지 않은 상태에서 boardregister를 누르면 로그인창으로 이동하여야 하나, erropage로 이동하여서, 강사님이 새로운 프로젝트 파일로 주셨습니다.

강사님도 이유를 잘 모르겠다고 하시나, 제가 조금 살펴보니 기존 프로젝트에서는 예외가 발생하였을 때 erropage로 이동하는(org.zerock.exception.CommonExceptionAdvice.java) 클래스가 있었으나, 새로 주신 프로젝트에는 없으며 error_page.jsp 또한 없는 것이 차이인 것 같습니다.

그러므로 @PreAuthorize 를 이용해서 board register 등록버튼을 눌렀을 때 로그인창으로 이동함을 확인할 수 있습니다. (사진은 [게시물 작성 시 Spring Security 참고]

(기존 프로젝트를 복사하고 새로운 프로젝트를 생성해서 하겠습니다.)

[게시물 작성 시 Spring security 처리]

1. BoardControllr.java 에 Get/Post register() 메소드에 @PreAuthorize("isAuthenticated()")를

추가합니다.

BoardController.java

Register New Board 를 눌렀을 때, 로그인하지 않았으므로

로그인화면으로 이동하게 합니다.

로그인하면 /board/register 로 이동합니다. 첨부파일에 관한 Security를 하지 않아서 게시물 등록시 오류가 납니다.

2. Writer 에 현재 로그인한 사용자의 username 을 가져올 수 있도록

register.jsp에 principal.username을 추가합니다.

register.jsp sec 태그를 쓰기위해 import

register.jsp principal.username 추가

결과

3. form 이 동작할 때 CSRF 토큰이 동작해야 하므로 register.jsp 에 추가합니다.

register.jsp , 빨간줄이 뜨지만 정상적으로 작동합니다.

4. Spring Security 한글 처리를 위해 web.xml에 filter 순서가 중요합니다.

encoding filter 선언 후 url-pattern 을 /* 로 변경합니다.

web.xml

[게시물 조회와 로그인 처리]

로그인하지 않았거나 다른 작성자가 작성한 글의 경우 수정이 불가능하도록

로그인한 사용자가 작성한 글의 경우에만 수정/삭제가 가능하도록 합니다.

1. get.jsp 에 위의 문구를 실행하는 코드를 작성합니다.

<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec %> 로

태그라이브러리를 import 해야합니다.

1) isAUthenticated() 로 로그인 하지 않은 사용자는 Modify 가 안나오도록

2) C:if 로 pinfo.username == board.writer 가 같다면 Modify가 나오도록 한 것입니다.

get.jsp

admin90으로 user00 글을 보았을 때, Modify가 나오지 않는 것을 확인할 수 있습니다.

admin90으로 본인 글을 보았을 때, Modify가 나오는 것을 확인할 수 있습니다.

[조회화면에서 댓글 추가 버튼]

게시물 조회와 마찬가지로

로그인한 사용자만 댓글을 작성할 수 있도록

로그인하지 않은 경우 댓글쓰기 버튼이 보이지 않도록 해야합니다.

1. get.jsp 에 위 문구를 실행하는 코드를 작성합니다.

get.jsp

로그아웃 하였을 때 Reply Button이 나오지 않은 것을 확인할 수 있습니다. isAuthenticated() false

[게시물의 수정/삭제]

게시물의 수정/삭제도 마찬가지입니다. 게시물의 조회, 댓글조회와 같습니다.

1. modify.jsp 에 sec 태그라이브러리를 추가(사진 생략)하고 form 밑에 _csrf 토큰을 input 합니다.

그 후, Modify 와 Remove 버튼을 sec 태그와 c:if 태그의 조건들로 감쌉니다.

먼저, isAuthenticated()로 인증여부를 따지고, username 과 board.writer 가 동일한지 확인합니다.

※ get.jsp 에 동일한 요소를 걸어주었지만, 해커들은 get.jsp -> modify.jsp 에 들어가는 것이 아니고

modify.jsp로 바로 들어갈 수 있기 때문에 모든 요소에 보안요소를 걸어야 합니다.

modify.jsp

2. BoardController 에서 PostMapping "remove"와 "modify" 메소드에 @PreAuthorize 를 추가합니다.

1) @PreAuthorize 로 현재의 username(principal.username)과 작성자(#board.writer)가 일치하는지

확인합니다.

(1) @PreAuthorize는 해당 로직을 수행 후 권한을 검사합니다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=opzyra&logNo=221510214795

 

Spring Security Annotation

SpringSecurity를 통해 권한에 따른 접근 제한을 두고 싶을땐 Java Configuration의 경우 WebSecurit...

m.blog.naver.com

BoardController.java , remove는 board 객체를 받지 않기 때문에 파라미터에 writer를 받고 #writer 로 해야합니다.

Modify/Remove 버튼 표시 확인

Modify 작동 확인, Remove 도 작동되는지 확인합니다.

[Ajax와 Spring Security 처리]

로그인한 사용자만이 파일 업로드와 댓글 조작이 가능하도록 적용합니다.

Spring Security가 적용되면 POST, PUT, PATCH, DELETE와 같은 방식으로 Data를 전송하는 경우에는

반드시 추가적으로 'X-CSRF-TOKEN'와 같은 헤더 정보를 추가해서 CSRF 토큰 값을 전달하여야 합니다.

[게시물 등록 시 첨부파일의 처리]

1. register.jsp javascript 변수에 csrf 토큰을 넣어 ajax가

첨부파일을 추가(/uploadAjaxAction), 삭제(/deleteFile)를 위해 서버로 전달할 때 토큰값을 넣어줍니다.

register.jsp javascript uploadAjaxaction / beforeSend 입니다. s가 아닙니다.

register.jsp javascript deleteFile

2. UploadController.java 에 @PostMapping(/uploadAjaxAction) 과 @PostMapping(/deleteFile)에 @PreAuthoorize("isAuthenticated()")를 추가합니다.

UploadController.java uploadAjaxPost()

UploadController.java deleteFile()

결과확인

[게시물 수정/삭제에서의 첨부파일 처리]

1. modify.jsp도 get.jsp 와 같이 javascript 부분에 csrf 토큰을 넣어줍니다.

modify.jsp javacript

수정화면에서 파일선택을 눌러 새로운 파일을 추가했을 때 나오고,

Modify 버튼을 눌렀을 때 정상적으로 등록되면 성공입니다.