java, spring

[Spring] 스프링 시큐리티를 JSP에서 사용하기

isaac.kim 2021. 10. 4.
728x90
반응형

[Spring] 스프링 시큐리티를 JSP에서 사용하기

이전 글

2021.10.03 - [Spring] - [Spring] 스프링 시큐리티, 커스텀 테이블, 커스텀 UserDetailsService 활용

2021.10.01 - [Spring] - [Spring] 스프링 시큐리티 로그인 (커스텀 데이터베이스 사용)

 

JDBC와 쿼리를 이용해서 스프링 시큐리티를 사용할 수 있음에도 불구하고, 굳이 CustomUserDetailsService와 같이 별도의 인증/권한 체크를 하는 가장 큰 이유는 JSP 등에서 단순히 사용자의 아이디(스프링 시큐리티에서는 username) 정도가 아닌 사용자의 이름이나 이메일과 같은 추가적인 정보를 이용하기 위해서입니다.

 

JSP에서 스프링 시큐리티를 사용하기 위해 pom.xml 에 라이브러리를 추가합니다.

 

JSP에서 로그인한 사용자 정보 보여주기

'/sample/admin/ 과 같은 경로는 로그인한 사용자만이 접근할 수 있고, 만일 권한이 적당하지 않으면 볼 수 없는 페이지이므로 로그인한 사용자가 접근했을 때 해당 사용자의 여러 정보를 보여줄 필요가 있습니다.

admin.jsp

<sec:authentication property="principal"/>를 이용했을 때 의미하는 것은 UserDetailsService에서 반환된 객체입니다. 즉 CustomUserDetailsService를 이용했다면 loadUserByUsername( )에서 반환된 CustomUser 객체가 됩니다. 이것은 'principal'이 CustomUser를 의미하므로 'principal.member'는 CustomUser 객체의 getMember( )를 호출한다는 것을 알 수 있습니다.

 

브라우저에서 사용자 로그인 후에 보는 admin.jsp에 다음 정보들이 출력됩니다.


표현식을 이용하는 동적 화면 구성

 

경우에 따라 특정 페이지에서 로그인한 사용자의 경우 특정한 내용을 보여주고, 그렇지 않은 경우에는 다른 내용을 보여주는 경우가 있습니다. '/sample/all'이 이런 경우에 해당하는데 이때 유용한 것이 스프링 시큐리티의 표현식(expression)입니다. 스프링 시큐리티의 표현식은 security-context.xml에서도 사용됩니다.

 

스프링 시큐리티 표현식

표현식 설명
hasRole( [role] )

hasAuthority( [authority] )
해당 권한이 있으면 true
hasAnyRole( [role, role2] )

hasAnyAuthority( [authority] )
여러 권한들 중에서 하나라도 해당하는 권한이 있으면 true
principal 현재 사용자 정보를 의미
permitAll 모든 사용자에게 허용
denyAll 모든 사용자에게 거부
isAnonymous( ) 익명의 사용자의 경우(로그인을 하지 않은 경우도 해당)
isAuthenticated( ) 인증된 사용자면 true
isFullyAuthenticated( ) Remember-me로 인증된 것이 아닌 인증된 사용자인 경우 true

표현식은 거의 대부분 true/false를 리턴하기 때문에 조건문을 사용하는 것처럼 사용됩니다. '/sample/all'의 JSP 페이지를 이용해서 사용자의 로그인 상태에 따라 다른 화면을 구성해 보면 아래와 같은 형태가 됩니다.

all.jsp

all.jsp의 내용은 로그인한 경우와 그렇지 않은 경우에 따라서 다른 결과를 만들어 냅니다.

[좌] 로그인하지 않은 사용자                         [우] 로그인된 사용자


스프링 시큐리티를 JSP에서 사용하기에 대해 알아보았습니다.

728x90
반응형