[Spring]SpringSecurity - 5 . 뷰 보안하기


SpringSecurity - 5 . 뷰 보안하기

뷰 보안하기


스프링 시큐리티 JSP 태그 라이브러리 사용하기

스프링 시큐리티의 JSP 태그 라이브러리로 뷰 레이어에서 보안을 지원한다.

JSP 태그동작
security:accesscontrollist연결 제어 목록에서 권한이 부여된 사용자인 경우에만 조건부로 body의 내용을 렌더링함
security:authentication현재 인증 상세 정보를 렌더링함
security:authorizeSpEL 표현식이 참으로 평가되거나

JSP 태그 라이브러리를 사용하기 위해, 사용될 모든 JSP 파일에 선언을 해준다.

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



인증 상세 접근하기


스프링 시큐리티 JSP 태그 라이브러리가 하는 가장 간단한 것 중 하나는 사용자의 인증 정보에 쉽게 접근하는 것이다.

security:authentication이 그런 동작을 위해 사용된다.

웹사이트에서는 일반적으로 사용자명으로 사용자를 확인하며 “welcome”이나 “hello”메시지를 표시

Hello <security:authentication property="principal" />!  

property 애트리뷰트는 사용자 인증 객체의 프로퍼티를 확인한다.


security:authentication JSP 태그를 사용하여 몇가지 사용자 인증 상세 정보에 접근

인증 프로퍼티설정
authorities사용자에게 부여된 권한을 표현하는 GrantedAuthority의 모음
credentials주체를 확인하기 위해 사용되는 자격(일반적으로 사용자의 암호)
details인증과 관련한 추가 정보(IP 주소, 인증서 일련 번호, 세선 ID 등)
principal사용자의 주체

security:authentication은 뷰에 있는 프로퍼티 값을 렌더링한다.

그리고 이 값을 변수에 할당하려면 간단히 var 애트리뷰트에 변수명을 명시한다.


loginID변수에 값을 할당해 주는 예

 <security:authentication property="principal.username" var="loginID" /> 

변수는 기본 설정으로 페이지 범위로 생성된다. 하지만 요청이나 세션(javax.servlet.jsp.PageContext)같이 다른 범위로 생성하고 싶다면 scope 애트리뷰트로 명시해 줄 수 있다.


변수를 요청 범위로 생성하려면 scoperequest로 설정한다.

<security:authentication property="principal.username" var="loginId" scope="request"/>



조건부 렌더링


사용자가 볼 수 있는 권한에 따라 뷰의 일부분이 보여지거나 감추어져야만 한다.

이미 로그인한 사용자에게 로그인 폼이 보이거나 로그인 하지 않은 사용자에게 개별적 환영 메시지를 보여 주는 것은 아무 의미가 없다.

스프링 시큐리티의 security:authorize JSP 태그는 사용자가 획득한 권한에 따라 뷰의 일부를 조건부로 렌더링한다.


ROLE_SPITTER 권한이 있을 때만 spittle 폼을 보여주기 위해 security:authorize를 사용한 예

SpEL 기반의 security:authorize 조건부 렌더링

<security:authorize access="hasRole('ROLE_SPITTER')">
    ...
</security:authorize> 

access 애트리뷰트에는 security:authorize 보디의 렌더링 여부를 결정하기 위한 SpEL 표현식이 주어진다.

스프링 시큐리티에서 제공하는 표현식들을 포함하여 access 애트리뷰트를 설정할 때 사용했던 SpEL의 모든 기능을 갖고 있다.

애플리케이션에 사용자명이 “habuma”인 사용자만이 사용 가능한 관리 기능을 표시

<security:authorize access="isAuthenticated() and principal.username=='habuma'">
    ...
</security:authorize>

isAuthenticated()는 사용자가 인증된 경우 참을 반환하는 메소드이다.

principal은 사용자 주체를 의미한다. 즉, principal.username은 사용자명을 뜻한다.

보안 설정에서 antMatchers() 메소드를 추가하면 /admin URL과 관련한 보안이 더 강화된다.

authorizeRequests()
    .antMatchers("/admin")
        .access("isAuthenticated() and principal.username=='habuma'");

해당 URL(/admin)은 보안이 되어서 사용 권한이 있는 사용자가 아니라면 내용을 볼수가 없다.

이것을 위해 SpEL 표현식보안 설정security:authorize 태그의 access 애트리뷰트 두 곳에 선언했다.

security:authorize 태그의 url 애트리뷰트로 보안설정과 security:authorizeaccess 애트리뷰트의 중복을 제거할 수 있다.

보안 제약이 명시적으로 선언된 access 애트리뷰트와 달리 url 애트리뷰트는 간접적인 방법으로 주어진 URL 패턴에 대한 보안 제약을 나타낸다.

스프링 시큐리티 설정에서 이미 /admin에 대한 보안 제약을 선언했으므로 url 애트리뷰트를 아래처럼 사용할 수 있다.




© 2021. by Hojin Ahn

Powered by 🐯