시로 대 스프링 시큐리티 [닫기]


132

현재 Java 기반 보안 프레임 워크를 평가하고 있으며 Spring 3.0 사용자이므로 SpringSecurity가 올바른 선택 인 것처럼 보였지만 Spring 보안은 과도한 복잡성을 겪고있는 것으로 보입니다. 확실히 보안을 구현하는 것처럼 보이지는 않습니다. 시로는 훨씬 일관성 있고 이해하기 쉬운 것 같습니다. 이 두 프레임 워크 사이의 장단점 목록을 찾고 있습니다.

답변:


118

나도 스프링 시큐리티가 너무 복잡하다고 생각한다. 물론, 그들은 XML 구성의 양을 줄이기 위해 사용자 정의 XML 네임 스페이스를 만드는 것처럼, 복잡성을 줄일 수있는 일들을,하지만 나를 위해, 이러한 해결하지 않는 나의 봄 보안과 개인 근본적인 문제 : 그 이름과 개념은 종종 일반에 혼동 나를. 그냥 '얻기'가 어렵습니다.

두 번째로 시로를 사용하기 시작하면 '얻을'것입니다. 보안 세계에서 이해하기 어려운 것은 이해하기가 훨씬 쉽습니다. JDK에서 사용하기 어려운 것들 (예 : 암호)은 견딜 수있는 수준이 아니라 종종 사용하기 쉬운 수준으로 단순화되었습니다.

예를 들어, 비밀번호를 해시 + 소금하고 Java 또는 Spring Security에서 base64로 인코딩하는 방법은 무엇입니까? 시로의 솔루션만큼 간단하고 직관적 인 것도 아닙니다.

ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();

공통 코덱이나 그 밖의 다른 필요가 없습니다. 단지 시로 항아리.

이제 스프링 환경과 관련하여 대부분의 시로 개발자는 스프링을 기본 애플리케이션 환경으로 사용합니다. 그것은 시로의 스프링 통합이 훌륭하다는 것을 의미하며 모두 훌륭하게 작동합니다. Spring 앱을 작성하는 경우 보안 경험이 풍부하다는 것을 확신 할 수 있습니다.

예를 들어,이 스레드의 다른 게시물에있는 Spring XML 구성 예제를 고려하십시오. Shiro에서 (본질적으로) 같은 일을하는 방법은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd>

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
    <property name="loginUrl" value="/login.jsp"/>
    <property name="successUrl" value="/home.jsp"/>
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
    <property name="filterChainDefinitions">
        <value>
        /secure/** = authc
        /** = anon
        </value>
    </property>
</bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="realm" ref="myRealm"/>
</bean>

<bean id="myRealm" class="...">
    ...
</bean>

다른 Spring 예제보다 약간 더 장황하지만 IMO를 읽는 것이 더 쉽습니다.

또한 Shiro의 필터 체인 정의를 사용하는 것이 일반 필터 체인과 웹 기반 보안 규칙을 정의하는 가장 쉬운 방법 일 것입니다! web.xml에서 정의하는 것보다 훨씬 좋습니다.

마지막으로 시로는 극단적 인 '플러그 기능'도 제공합니다. Shiro의 POJO / 주입 친화적 인 아키텍처 덕분에 무엇이든 구성 및 / 또는 교체 할 수 있음을 알 수 있습니다. Shiro는 거의 모든 것을 기본값으로 설정하고 필요한 것만 무시하거나 구성 할 수 있습니다.

하루가 끝나면이 두 가지 중 하나를 선택하는 것이 당신의 정신 모델에 관한 것이라 생각합니다. 두 가지 중 어느 것이 더 합리적이고 직관적입니까? 어떤 사람들에게는 시로 (Shiro), 다른 사람들에게는 봄 보안 (Spring Security)이 될 것입니다. Shiro는 봄 환경에서 훌륭하게 작동하므로 둘 중 어느 것을 더 좋아하고 가장 적합한 지에 따라 선택한다고 말하고 싶습니다.

시로의 스프링 통합에 대한 자세한 내용은 다음을 참조하십시오 : http://shiro.apache.org/spring.html


shiro를 사용하기 전에이 모든 것을 읽었습니다. 시로 주석은 봄에 몇 가지 문제를 겪는 것처럼 보입니다. 시로 주석은 해결 방법에 대한 정보가 매우 많으며 스택 오버 플로우 (1 또는 2가 직접 게시)에 다양한 게시물이있어 대부분 대답이 없습니다. 나는 합병증에도 불구하고 스프링 보안을해야한다고 진지하게 생각하고 있었고, 사람들이 나를 올바른 방향으로 안내 할 수 있다고 확신합니다.
black sensei

@blacksensei 당신은 당신이 언급 한 문제를 해결 했습니까? Shiro를 고수하거나 Spring Security로 전환?
Alexander Suraphel

안녕하세요 @AlexanderSuraphel 그 프로젝트에 대해 Spring으로 이동하지 않았습니다. 동료가 적극적으로 사용하고 있습니다. 스프링 부트 프로젝트에서 테스트 할 계획입니다. 그것은 나를 위해 잘 작동합니다. 다른 모든 프로젝트를 옮길 것입니다. 그렇게 간단합니다
블랙 센시

좋아, 나는 다음 프로젝트를 위해 시로를 시험하기로 결정했다!
Eric Wang

32

시로를 사용한 경험이 없으며 Spring Security에 대해 말한 것에 부분적으로 동의합니다. Spring Security 3.x 이전에는 Spring Security (또는 Acegi)를 설치하기가 매우 어려웠습니다. 간단한 역할 기반 구성에는 최소한 140 줄의 암호화 XML 구성이 필요합니다. 실제로 실제로 줄을 세었기 때문에 이것을 알고 있습니다. 한 번만 설정하면 구성을 다시 만지지 않아도 영원히 작동하도록기도합니다. 모든 구성의 의미를 잊었 음을 확신 할 수 있기 때문입니다. :)

Spring Security 3.x에서는 크게 개선되었습니다. security140 줄에서 ~ 30 줄로 구성을 크게 단축시키는 네임 스페이스를 소개 합니다. 내 프로젝트 중 하나의 Spring Security 3.x의 예는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

    <security:http auto-config="true">
        <security:form-login login-page="/index.do" authentication-failure-url="/index.do?login_error=1" default-target-url="/index.do"
            always-use-default-target="true" />
        <security:logout logout-success-url="/index.do" />
        <security:intercept-url pattern="/secure/**" access="ROLE_ADMIN,ROLE_USER" />
        <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    </security:http>

    <bean id="customAuthenticationProvider" class="my.project.CustomAuthenticationProviderImpl">
        ...
    </bean>

    <security:authentication-manager>
        <security:authentication-provider ref="customAuthenticationProvider" />
    </security:authentication-manager>

</beans>

Spring Security 3.x의 장점은 매우 구성하기 쉽다는 점입니다. 이해하기에는 너무 복잡합니다. Spring Security가 사용하는 용어 중 일부에만 익숙하기 때문에 문서를 읽기가 쉽지 않습니다. 그러나 사용자 지정 구성을 만들거나 보안 수준을 세분화해야하는 경우 옵션이 있습니다. 또는 위의 <30 줄을 사용하여 역할 기반 보안 검사를 수행 할 수 있습니다.

Spring Security에 대해 내가 정말로 좋아하는 것은 일단 설정되면 보안이 프로젝트에 완벽하게 통합됩니다. 실제 프로젝트 코드가 보안의 존재를 알지 못하는 것과 같습니다 ... 그리고 나중에 보안 구성 요소를 쉽게 분리하거나 업그레이드 할 수 있기 때문에 좋습니다 (예 : 데이터베이스 인증을 LDAP / CAS로 변경하십시오) 인증).


컨테이너 기반 보안에서 시로 또는 기타와 같은 대안으로 전환하는 것이 좋은 경우에 대해 말하고 싶습니까? 여기에 더 초점을 맞춘 질문을 참조 : stackoverflow.com/questions/7782720/...
라자 굽타

10
나는 시로와 스프링 보안을 모두 시도했으며, 개인적으로 시로는 스프링 보안이 복잡하다고 느끼는 곳을 이해하기가 쉽다고 생각합니다. 스프링 보안에서 역할 / 그룹 / 사용자에게 할당 할 수있는 권한을 설정하는 방법을 아직 파악하지 못했습니다 (ACL이 해결책 일 수 있습니다). 시로와 함께 그것은 매우 쉬웠다. 나는 스프링 보안이나 시로의 전문가가 아니며, 둘 다의 사용자로서의 개인적인 경험입니다.
Sudhir N

@sudhir 시로의 구성에 병목 현상이 발생 했습니까?
Alexander Suraphel

그것은 우리의 모든 사용자 사례에서 효과적이었습니다. 대부분의 상황에 맞게 조정할 수 있다고 생각합니다. 사용 사례는 무엇입니까?
Sudhir N

21

나는 몇 달 동안 스프링 보안 (버전 3.1)을 사용하고 있었고 매우 기뻤습니다. 그것은 정말 강력하고 아주 좋은 기능을 가지고 있습니다. 특히 이전처럼 손으로 모든 것을 구현 한 후에! 그러나 어딘가에서 읽은 것처럼 앱 개발 시작 부분 근처에서 한 번 설정 한 다음 끝까지 계속 작동하도록기도하십시오. 아마도 당신이 매개 변수로 삼아야 할 것들 대부분을 잊었을 것입니다.

그러나 더 복잡한 보안 요구 사항을 갖춘 새로운 프로젝트가 등장했습니다. 요컨대, 우리는 두 개의 관련 웹앱 사이에 일종의 커스텀 SSO를 구현해야했습니다.

HTTP 로직, 쿠키, 세션 ID 및 항목과 관련하여 달성하고자하는 것과 정확히 어떤 순서로 발생 해야하는지 정확히 알고 있었지만 Spring Security API로 어려움을 겪고있는 하루 중 더 나은 시간을 보냈지 만 여전히 파악할 수 없었습니다. 내가 구현하거나 재정의 한 클래스 또는 인터페이스와 컨텍스트에 연결하는 방법을 정확하게 파악하십시오. 전체 API는 때때로 복잡하고 약간 난해하다고 느꼈습니다. 이 문서는 일반적인 사용 사례 및 일부 사용자 정의에 매우 적합하지만 내 요구를 충족시키기에 충분하지 않습니다.

여기 및 웹의 다른 곳에서 답변을 읽은 후 Shiro가 이해하기 쉽고 내 요구에 맞게 사용자 정의 할 수 있다는 인상을 받았습니다. 그래서 나는 그것을 시도했다.

그리고 하루를 보낸 후에 API에 대해 충분히 배우고 문제없이 Spring webapp에서 기본 인증 및 권한 부여 시스템을 설정할뿐만 아니라 사용자 정의 SSO 동작을 구현할 수 있었기 때문에 기뻤습니다. 찾고있는. 나는 2 ~ 3 개의 클래스 만 확장해야했고 스프링 컨텍스트에서 XML 구성의 약 25 줄 만 걸렸습니다.

결론적으로, 사용 편의성 및 학습 곡선 측면에서 시로는 실제로 매우 적합하며 일부 기능이 부족하거나 다른 문제가 발생하지 않는 한 향후에도 계속 사용할 것이라고 생각합니다. 지금까지).

TL; DR : 둘 다 강력하지만 시로는 배우기가 훨씬 쉽습니다.


피에르, 입력 주셔서 감사합니다. 또한 sso가 필요합니다. 어떤 클래스를 노출해야하는지 몇 가지 예를 보여줄 수 있다고 생각하지 않습니다.
KingAndrew

@KingAndrew : 몇 마디로 내가 한 것은 내 자신의 AuthorizingRealm, AuthenticationToken 및 AuthenticationFilter를 구현하는 것이 었습니다. 그리고 필요한 모든 필터와 배관. 그러나 내가하는 것은 "정상적인"sso가 아니며, 두 앱 사이에서 공통적 인 DB에 저장된 토큰을 기반으로합니다. 따라서 별도의 SSO 서버를 사용하지 않습니다.
Pierre Henry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.