Acegi로 웹 애플리케이션 보안하기 5
5. HttpSessionIntegrationFilter 사용하기
앞에서 인증과 보안에 관련된 필터과 bean들을 모두 등록했지만, 애플리케이션은 동작하지 않습니다. 그 이유는 보안 정보가 여러 요청들 간에 유지되지 않기 때문입니다. 이 문제를 해결하기 위해 보안 정보를 Session에서 관리하는 필터를 등록해 줍니다.
<bean id="httpSessionContextIntegrationFilter"
class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" />
이 필터는 다른 객체를 사용하지 않고 있어서 설정이 매우 간단합니다. 이렇게 등록한 다음 역시 다른 필터들과 마찬가지로 FilterChainProxy에 등록해 줍니다.
이 필터를 제일 앞에 등록합니다. 그 이유는 이 녀석이 하는 일과 관련이 있습니다.
그림은 IBM 기사에서 가져왔습니다. 먼저 Filter Chain Proxy에서 SIF를 호출하고 이 필터에게 요청을 넘깁니다.(1) 그럼 SIF는 이 요청이 이전에 다뤘던 요청인지 아닌지 판단합니다.(2) 만약에 이전에 다뤘던 요청이면 일을 끝내고 다음 필터로 요청을 넘깁니다.(4) 처음 다루는 요청이면 플래그를 설정하고(이미 다룬 요청이라는 것을 기억하기 위해) 세션 객체가 있는지 그리고 그 안에 보안 문맥(Security Context)를 담고 있는지 확인합니다. 있으면, 해당 보안 객체를 Security Context Holder에 넣어 둡니다. 만약 세션 객체가 없으면 새로운 보안 문맥을 생성하고 그것을 Security Context Holder에 넣어 둡니다.(3) 그런 다음 요청을 다음 필터로 넘깁니다.(4)
다른 필터들이 이 보안 문맥을 수정할 수 있습니다.(5) 모든 필터의 처리가 완료된 다음 SIF가 제어권을 가지게 됩니다.(6) 필터 체인 특성 상 그렇게 되어있습니다.
만약 이 때 Security Context가 변경되어 있다면, 이 정보로 Session 객체있는 Security Context를 수정합니다.(7)
이제는 애플리케이션에 한 번 로그인 상태로 끝내더라도, 다음에 접속할 때 정보를 계속 유지하고 있게 됩니다. 즉, 서버를 꼈다 켜도 사용자 정보를 기억하고 있습니다. 신기하네요.
이제 사용자 정보를 유지하는 방법은 알아냈는데, 문제는 한 번 로그인 한 사용자의 정보를 Session에서 삭제하는 방법입니다. 계속해서 한 사용자로 로그인 되어 있으면 안 되겠죠. 로그아웃이 필요합니다.
그리고 사용자 정보가 없을 때 예외를 브라우저에 출력하지 말고 로그인 폼으로 이동하도록 하는 예외 처리가 필요합니다.
다음 글에서 예외 처리와 로그아웃 필터를 다루겠습니다.