jwt 이용한 게시판 사용 시 인가 해주기

gnoesnooj·2022년 4월 18일
0

배경

같이 프로젝트를 진행하는 친구가 짜놓은 jwt 를 이용해서, 내가 만든 Post 와 Reply 의 수정, 삭제에 권한을 부여하는 일을 하게 되었다.
일차적으로 로그인이 되어 있는지 안되어 있는지를 검증하고, 그 다음으로 해당 게시글과 댓글이 본인이 작성한 것이 맞는지를 판별하도록 계획을 잡았다.

진행

사실 스프링 시큐리티와 jwt에 대한 정확한 이해를 하지 않고 개발을 시작했었기에, 많은 어려움이 있었다. 또한 진행을 하면서 내가 세션과 토큰의 정확한 차이점에 대해 숙지를 하지 않았었다는 것 또한 깨닫게 되었다.
그래서 다음과 같은 순서로 접근했다.

  1. 스프링 시큐리티 동작 원리
  2. 세션기반과 토큰기반의 차이
  3. 동료가 짜놓은 JWT 코드 이해하기

어려웠던 점

  1. 초기에는 현재 세션 에서 Id 를 가져온 후 진행하려 했으나, 내가 해야하는 건 JWT이고, 당연히 알아야할 세션과 토큰의 차이를 정확하게 숙지하지 않았다는 엄청난 부끄러움을 느끼게 되었다.

  2. User 에는 IdUserId 두 필드가 존재했었다. 하나는 DB에서 PK를 위한 Id 이고, 다른 하나는 웹사이트에 접속할 때 ID : gnoesnooj, PW : joonseong123 할 때의 ID 였다. 하지만 코드를 이해하던 중 setAuthentication의 userId 값이 String 이여서 후자의 ID 인줄 알고 코드를 이해해서 어려움을 겪었다..

  3. 현재 api 를 사용하고 있는 USER에 대한 내용을 가져오는 방법에 대해 알아내기가 어려웠다. 여러 구글링을 하던 중 스프링 시큐리티의 동작 원리를 파악해야겠다는 생각을 하게 되었고, 그 안에 SpringContextHolder 에서 가져올 수 있다는 것을 알게 되었다. (SpringContextHolder를 통해 getPrincipal()를 하게 되면, 작성해놓은 UserDetails 를 통해서 return을 받을 수 있다.)

코드


우선 SecurityConfigvoid Configure() - antMatchers에 post 컨트롤러와 reply 컨트롤러의 수정, 삭제를 추가해 주었다.

이후 컨트롤러에 현재 사용자의 정보를 가져온 후, 이를 해당 post의 실제 User 가 맞는지를 판단하도록 하는 메소드를 작성해주었다.

권한을 검증해줄 메소드 앞에 checkUser(id) 를 붙여줘서 검증을 진행하도록 한다.

마무리

쉬울 줄 알았는데 내가 몰랐던 사실이 너무 많아서 어려웠고, 전부 파악하느라 많은 어려움이 있었는데, 막상 하나씩 차근차근 이해하면서 나아갔다.
마지막에 POSTMAN 테스트를 통과했을 때는 매우 뿌듯했던 것 같다.
실제 현업에서도 이런 식으로 코드를 짜는지 궁금했는데, user 확인을 위한 api를 아예 따로 관리하고, 어노테이션을 작성해서 관리한다고 한다.
나중에 이 checkUser()를 가지고 어노테이션으로 만드는 방법을 한번 찾아봐야겠다.

profile
누구나 믿을 수 있는 개발자가 되자 !

0개의 댓글