저희 팀은 이번 프로젝트에서 스프링 시큐리티를 적용했습니다.

스프링 시큐리티를 적용하면서 발생한 몇 가지 문제점에 대해 정리하였습니다.

목차

1. 등급별 테이블의 분리/통합 여부

저희는 총 3개 USER, ADMIN, MANAGER 로 보안 등급을 나누고 있습니다.

기존에는 3개의 등급을 Entity로 구분하였는데 이 경우 “스프링 시큐리티 적용에 문제가 발생한다.”는 피드백을 받아 3개의 Entity를 USER하나의 Entity로 통합하고, USER별 보안 등급을 알 수 있는 authority컬럼을 추가했습니다.

2. JWT 토큰 발행 시 권한 부여

저희는 로그인 시 해당 사용자에 대한 권한을 토큰에 담아 놓고, 해당 사용자의 요청이 들어왔을 때 토큰의 권한 정보를 이용해 사용자의 접근을 제한하였습니다.

해당 기능을 구현하기 위해 기초 자료들을 탐색하였지만 대부분 유저에 대한 권한 만을 부여할 뿐, 유저와 어드민에 권한을 따로 부여하는 방법은 찾는 데에 어려움이 있었습니다.

그래서 고안해 낸 방법으로, 위에서 설정한 autority정보를 통해 해당 유저의 권한을 아래와 같이 **getter**로 만들었습니다.

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
					// 여러 권한이 부여될 수 있기 때문에 List 형태로 리턴합니다.
    return List.of(new SimpleGrantedAuthority(this.authority));
}

그 후 토큰 발급 시 getAuthorities()를 실행해 권한 정보를 불러온 후, user라면 “ROLE_USER”로, admin은 “ROLE_ADMIN”의 형태로 만들었습니다.

String auth = "";

if(user.getAuthority().equals("user")){
        auth = "ROLE_USER";
}else if(user.getAuthority().equals("manager")){
        auth = "ROLE_MANAGER";
}else if(user.getAuthority().equals("admin")){
        auth = "ROLE_ADMIN";
}