용어
- 접근주체 / Principal : 보호된 리소스에 접근하는 대상
- 인증 / Authentication : 접근주체에 대해 누구인지, 어플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정
- 인가 / Authorization : 해당 리소스에 대해 접근 가능한 권한을 가지고 있는지 확인하는 과정
- 권한 / Authority :
- 어떤 리소스에 대한 접근 제한
- 모든 리소스는 접근 제어 권한이 걸려있다
- 인가과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인
개요
- 엔터프라이즈 어플리케이션을 위한 인증(Authentication)
- 권한처리 (Authorization)
- ServletFilter 와 JavaAOP를 통한 Interceptor를 사용, 보안을 강제
- Spring IoC와 Lifecycle 서비스 기반으로 동작
- 인증, Web URL authorization, Method호출 authorization, 도메인 객체 기반의 security처리, 채널 보안(https 강제), Human user 인식 등의 기능 제공
절차
- 일반적인 경우
- 리소스 요청
- 보호된 리소스인지 확인
- 인증여부 확인 (개발자 직접 구성)
- 권한부여 (개발자 직접 구성)
- 스프링시큐리티
- 요청이 서블릿에 전달되기 전 필터가 걸러 인증확인
- AuthenticationFilter
- 아이디와 비밀번호를 사용하는 form기반 인증에서 로그인 URL로 오는 요청 감시
- AuthenticationManager를 통한 인증 실행
- 인증 성공 시 SecurityContext에 저장 후 AunthenticationSuccessHandler 실행
- 인증 실패 시 AuthenticationFailureHandler 실행
- AuthenticationManager
- Spring Security의 필터들이 인증을 수행하는 방법에 대한 명세를 정의해 놓은 인터페이스
- AuthenticationProvider
- form 기반 인증에서는 아이디, 패스워드가 유효한지 확인하는 이너페이스
- 직접 구현하거나 Spring의 DaoAuthenticationProvider클래스 활용 가능
- UserDetailsService
- DB에서 유저 정보를 가져오는 역할
- loadUserByUsername 메소드를 구현
- UserDetails
- 사용자 정보를 담는 인터페이스
- UserDetailsService 인터페이스를 통해 가져온 사용자 정보를 담아두는 구현체를 구성해 사용
설정 간소화
- egovframework는 spring security의 설종을 간소화할 수 있는 방법 제공
- conext-security.xml
XML namespace 및 schema 설정
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:egov-security="http://maven.egovframe.go.kr/schema/egov-security"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http:// maven.egovframe.go.kr/schema/egov-security
http:// maven.egovframe.go.kr/schema/egov-security/egov-security-4.0.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
…
</beans>
Security Config 설정
<egov-security:config id="securityConfig"
loginUrl="/uat/uia/EgovCvplLogin.do"
logoutSuccessUrl="/EgovCvplLogin.do"
loginFailureUrl="/uat/uia/EgovCvplLogin.do?login_error=1"
accessDeniedUrl="/sec/ram/accessDenied.do"
dataSource="dataSource"
jdbcUsersByUsernameQuery="SELECT USER_ID,PASSWORD,ENABLED FROM USERS WHERE USER_ID = ?"
jdbcAuthoritiesByUsernameQuery="SELECT USER_ID,AUTHORITY FROM AUTHORITIES WHERE USER_ID = ?"
jdbcMapClass=”egovframework.com.sec.security.com.EgovSessionMapping"
requestMatcherTpe="regex"
hash =“sha256“
hashBase64=“false“
sniff="true"
xframeOptions="SAMEORIGIN"
xssProtection="true"
cacheControl=“false”
csrf="false"
csrfAccessDeniedUrl=”/egovCSRFAccessDenied.do"
/>
- loginUrl : 필수 / 로그인 페이지 URL
- logoutSuccessUrl : 필수 / 로그아웃 처리 시 호출되는 페이지 URL
- loginFailureUrl : 필수 / 로그인 실패 시 호출되는 페이지 URL
- accessDeniedUrl : 필수 / 권한이 없는 경우 호출되는 페이지 URL
- dataSource : 선택 / DBMS 설정 dataSource
- jdbcUserByUsernameQuery : 선택 / 인증에 사용되는 쿼리
- 디폴트 : select user_id, password, enabled, users.* from users where user_id = ?
- jdbcAuthoritiesByUsernameQuery ; 선택 / 인증된 사용자의 권환 조회 쿼리
- 디폴트 : select user_id, authority from authorites where user_id = ?
- jdbcMapClass : 선택 / 사용자 정보 mapping처리 class
- 디폴트 : egovframework.rte.fdl.security.userdetails.DefaultMapUserDetailsMapping
- requestMatcherType : 선택 / 패턴매칭방식
- 디폴트 : regex
- ant, regex, ciRegex:case-insenstive regex
- hash : 선택 / 패스워드 저장 방식
- 디폴트 : sha-256
- sha-256, plaintext, sha, md5, bcrypt
- hastBase64 : 선택 / hash값 base64 인코딩 사용 여부
- concurrentMaxSessions : 선택 / 동시 접속 가능 연결 수
- concurrentExpiredUrl : 선택 / expried된 경우 redirect되는 페이지 URL
- errorIfMaximumExceeded : 필수 / 중복 로그인 방지 옵션
- defaultTargetUrl : 선택 / 로그인 성공 시 redirect 되는 페이지 URL
- 미지정시 처음 접속하려 했던 URL로 redirect
- alwaysUseDefaultTargetUrl : 필수 / 로그인 이후 설정한 페이지로 이동하게 하는 옵션
- sniff : 필수 / 선언된 콘텐츠 유형으로부터 벗어난 응답에 대한 브라우저의 MIME 가로채기 방지 여부
- xframeOptions : 선택 / sniff옵션이 true일 때 X-Frame-Options 범위 설정
- xssProtection : 필수 / 해당 기능 사용 여부
- cacheControl : 필수 / 캐쉬 비활성화 여부
- csrf : 필수 / 해당 기능 사용 여부
- csrfAccessDeniedUrl : 필수 / 토큰 검증이 실패했을 경우 호출되는 페이지 URL
Security Object Config 설정
<egov-security:secured-object-config id="securedObjectConfig“
roleHierarchyString="
ROLE_ADMIN > ROLE_USER
ROLE_USER > ROLE_RESTRICTED
ROLE_RESTRICTED > IS_AUTHENTICATED_FULLY
IS_AUTHENTICATED_FULLY >IS_AUTHENTICATED_REMEMBERED
IS_AUTHENTICATED_REMEMBERED > IS_AUTHENTICATED_ANONYMOUSLY"
sqlRolesAndUrl="
SELECT auth.URL url, code.CODE_NM authority
FROM RTETNAUTH auth, RTETCCODE code
WHERE code.CODE_ID = auth.MNGR_SE"
/>
- roleHierarchyString : 선택 / 계층처리를 위한 설정 문자열 지정
- sqlRolesAndUrl : 선택 / URL 방식 role 지정
- 미지정시 SecuredObjectDAO의 기본 쿼리
- sqlRolesAndMethod
- sqlRolesAndPointcut
- sqlRegexMatchedRequestMapping : 선택 / reqiest마다 best matching url 보호차원 지정 쿼리
- sqlHierarchicalRoles : 선택 / 계층처리를 위한 쿼리
Security Config Initializer 설정
<egov-security:initializer id="initializer"
supportPointcut="true”
supportMethod=“true”
/>
- supportPointcut : 선택 / pointcut 방식 지원여부
- supportMethod : 선택 / method 방식 지원여부
참고
- https://spring.io/projects/spring-security
- https://docs.spring.io/spring-security/site/docs/5.4.6/reference/html5/