togather-2024 / togather-backend

0 stars 0 forks source link

Spring Security in togather #26

Open david1403 opened 6 months ago

david1403 commented 6 months ago

Basic

Authentication (인증)

Authorization (인가)

적용

크게 네 가지 영역으로 나눌 수 있습니다.

  1. 누구나 접근할 수 있는 요청( e.g. 회원가입 / 로그인 / 파티룸 조회)
  2. 로그인이 필요한 요청 (e.g. 파티룸 예약하기)
  3. 로그인 + 권한이 필요한 요청 (e.g. 파티룸 등록하기는 호스트 권한을 가진 사용자만 가능)
  4. 로그인 + 권한 + 주인체크(를 비롯한 비즈니스 체크)가 필요한 요청 (e.g. 파티룸 수정하기는 호스트 권한을 가진 사용자 + 자기 자신의 파티룸만 수정 가능 / 리뷰를 남기는 유저는 유저 권한을 가진 사용자 + 예약내역이 있는 경우에만 남기기 가능 등)

각 영역에 대한 접근법입니다.

  1. 1번 영역은 별도의 설정 없이 컨트롤러를 만들면 됩니다. 플젝의 기본 세팅이 별도의 설정이 없으면 permitAll로 되어있습니다.
  2. 2번 영역은 컨트롤러(심지어 서비스에서도 가능!!)의 메서드에 @PreAuthroized("isAuthenticated()") 를 적용하면 로그인한 유저만 접근 가능합니다. 로그인되지 않은 유저는 401에러를 받게 됩니다.
  3. 3번 영역은 위에서 설명한 @PreAuthorize( "hasRole('ROLE_HOST')" 와 같은 어노테이션을 사용하면 됩니다. HOST 부분은 필요에 따라 USER / HOST / ADMIN (혹은 미래에 생길 권한까지) 로 변경될 수 있습니다.
    • 로그인 자체가 안된 유저는 401 (인증오류니까) / 로그인은 되어있으나 권한이 없는 유저는 403 (인가오류니까) 를 받게됩니다.
  4. 4번 영역에 대해서는 PartyRoomController에 예시를 들어놨습니다. 3번처럼 @PreAuthorize 까지는 해줘야합니다. 그러면 아예 로그인이 안된 유저 / 권한이 없는 유저는 오류를 받게됩니다. 이에 추가적으로 로그인한 유저와 유저가 변경하려고 하는 대상의 정보와 일치 여부를 판단해야 합니다. 만약 다를 경우 인가오류와 마찬가지로 403 AccessDenied 에러를 받게 됩니다.

Diagram - Login flow

image

Diagram - Authorization Flow

image

Lucid chart url: https://lucid.app/lucidchart/d5a5cd20-285c-4447-9d0e-caa2fb51b1a7/edit?page=SweiZA9NLL0U&invitationId=inv_d98c8207-966b-4ed4-8694-3c3b44b83ce0#

sejyom commented 6 months ago

자세한 설명 감사합니다.....🥹