당신은 주제를 찾고 있습니까 “spring security session 관리 – 스프링 보안 동시 세션“? 다음 카테고리의 웹사이트 https://you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Java Development Journal 이(가) 작성한 기사에는 조회수 5,206회 및 좋아요 88개 개의 좋아요가 있습니다.
spring security session 관리 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 스프링 보안 동시 세션 – spring security session 관리 주제에 대한 세부정보를 참조하세요
Spring security concurrent sessions. Lean how to use the #springsecurity and the concurrent sessions control feature to restricting the number of concurrent sessions per User. In this #springsecuritytutorial, we will also see how the concurrent sessions feature works internally and how we can customize the behavior in our #springapplication.
We will take closer look at the internal working of spring security and how SessionRegistry, ConcurrentSessionControlStrategy, HttpSessionEventPublisher, SessionManagementFilter and ConcurrentSessionFilter works together to accomplish this feature sing spring session management.
This #springtutorial also covers some of the important point while enabling this feature and how #springsession can help us to overcome some of the limitations of #concurrentsession.
List of few articles for your reference:
https://www.javadevjournal.com/spring-security/spring-security-session/
https://www.javadevjournal.com/spring-security/spring-security-remember-me/
https://www.javadevjournal.com/spring/spring-session/
#springsecuritytutorials #springboot #springmvc #security #session #httpsession #sessionmanagement #springframework #springcore #springsecurity
spring security session 관리 주제에 대한 자세한 내용은 여기를 참조하세요.
[Spring Security] 세션(Session) 관리 – velog
동시 세션 관리. 스프링 시큐리티에서는 한개의 계정에 대해 생성되는 세션의 개수를 설정하고 세션이 최대 개수가 되었을 때 처리할 방법을 쉽게 …
Source: velog.io
Date Published: 6/9/2022
View: 9815
스프링시큐리티 공부 12 – 세션관리 (ConcurrentSessionFilter)
Spring Security. 스프링시큐리티 공부 12 – 세션관리 (ConcurrentSessionFilter). UGO04 2021. 7.
Source: ugo04.tistory.com
Date Published: 3/3/2022
View: 8534
[ Spring Security ] 03. 동시 세션제어와 세션 고정보호, 세션 …
[ Spring Security ] 03. 동시 세션제어와 세션 고정보호, 세션 정책 관리. kim.svadoz 2021. 12. 8. 16:21. 320×100. 반응형. 인프런에서 진행하는 정수원 강사님의 …Source: coder-in-war.tistory.com
Date Published: 7/13/2021
View: 2271
Spring Security Session과 CSRF에 대해.. – ChanGrea.io
스프링 시큐리티, 설정, 아키텍처 인증(Form), 인증(DB, Logout) / 인가 CSRF 방지 세션 관리 CSRF(Cross Site Request Forgery) CSRF…
Source: changrea.io
Date Published: 1/27/2021
View: 8584
[Spring Boot] Spring Security 세션 인증 정책 예제 – KKUKKUKKU
@Overre protected vo configure(HttpSecurity http) throws Exception { // 세션 관리 기능 작동 http.sessionManagement() .
Source: kkukkukku.dev
Date Published: 4/19/2021
View: 5121
[spring boot] 스프링 시큐리티 세션 활용하기 – 개발냥발
여기서 스프링 시큐리티 측에서 세션을 따로 관리하고 있다고 추측을 했습니다. … Spring Security에서 로그인한 사용자의 정보를 가져오는 방법에 …
Source: coding-nyan.tistory.com
Date Published: 1/29/2021
View: 6755
Spring Security : Session 정책 설정
이 글은 인프런 정수원님의 강의를 복습하며 작성한 글입니다. Spring Security Session 정책 Spring Security는 Session을 관리하는 정책을 API로 …
Source: ojt90902.tistory.com
Date Published: 3/28/2021
View: 3616
Spring Security #2 다양한 사용법 – 익명사용자, 세션 제어, 예외 …
스프링 시큐리티 – Spring Boot 기반으로 개발하는 Spring Security – 인프런 | 강의 초급에서 중. … 세션 관리 필터 (SessionManagementFilter).
Source: jiwondev.tistory.com
Date Published: 6/16/2021
View: 4838
[Spring Security] 스프링 시큐리티 기본 API 및 Filter 이해
[Spring Security] 스프링 시큐리티 기본 API 및 Filter 이해. 김민수 2021. … 인증 시 사용자의 세션정보를 등록,조회 삭제 등의 세션 이력을 관리.Source: minsoolog.tistory.com
Date Published: 9/8/2021
View: 2323
Spring Security (1) – 로그인 세션
이번 챕터에서는 Spring Security를 알아보기전, 고전적인 세션을 통한 로그인 관리에 대해서 알아보도록 하겠습니다.
Source: taes-k.github.io
Date Published: 12/7/2021
View: 3610
주제와 관련된 이미지 spring security session 관리
주제와 관련된 더 많은 사진을 참조하십시오 스프링 보안 동시 세션. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 spring security session 관리
- Author: Java Development Journal
- Views: 조회수 5,206회
- Likes: 좋아요 88개
- Date Published: 2021. 1. 7.
- Video Url link: https://www.youtube.com/watch?v=rWIVa-nTX6Q
스프링시큐리티 공부 12 – 세션관리 (ConcurrentSessionFilter)
반응형
스프링이 SecurityContextHolder를 유지하기 위한 방법중 하나는 session을 활용하여 SecurityContextHolder를 유지하는 방법이다 . 지금까지 공부했던 formLogin 방식이 session 기반으로 동작하는 대표적인 로그인 방식이다 .
SecurityContextHolder를 알아봤으니 이제 스프링이 SecurityContextHolder을 유지할 때 사용하는 session에 대해 알아보자 .
ConcurrentSessionFilter
session은 톰캣과 같은 서블릿 컨테이너에서 제공하는 것이기 떄문에 스프링이 세션을 제어할 수는 없고 톰캣이 넘겨주는 세션을 스프링은 sessionInformation이라는 랩퍼객체를 만들어 SessionRegistry에서 관리한다. 톰캣의 세션과 SessionRegistry의 세션이 일치한다고는 할 수 없지만 요청이 들어왔을때 스프링에서 sessionInformation의 expired를 통해 해당 세션을 스프링 컨테이너로 받아 줄지 말지를 결정할 수 있기 때문에 세션을 관리하는 효과를 낼 수 있다 해당 역할을 하는 필터가 ConcurrentSessionFilter이다.
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { HttpSession session = request.getSession(false); if (session != null) { SessionInformation info = this.sessionRegistry.getSessionInformation(session.getId()); if (info != null) { if (info.isExpired()) { // Expired – abort processing this.logger.debug(LogMessage .of(() -> “Requested session ID ” + request.getRequestedSessionId() + ” has expired.”)); doLogout(request, response); this.sessionInformationExpiredStrategy .onExpiredSessionDetected(new SessionInformationExpiredEvent(info, request, response)); return; } // Non-expired – update last request date/time this.sessionRegistry.refreshLastRequest(info.getSessionId()); } } chain.doFilter(request, response); }
ConcurrentSessionFilter의 doFilter메서드를 살펴보면 session을 가져와 sessionRegistry에서 sessionInfomation을 얻어내고
sessionInfomation의 expired가 true인지 false인지 확인하여 true라면 세션을 expired시키고 sessionRegistry에서 해당 세션을 정리한다. 그림으로 보면 아래와 같다.
sessionRegistry
세션들을 저장 해놓는 역할을 한다.
principals 과 sessionIds 를 필드로 갖고 있으며 구현체로는 SessionRegistryImpl 클래스가 있다.
principals는 Map의 형태로 Principal 객체와 , Set형태의 세션 아이디를 갖으며
sessionIds는 세션 아이디 와 해당 세션아이디에 대한 SessionInfomation(위 그림의 SessionInfomation 테이블의 정보를 담는다)이 담긴다.
SessionManagementFilter
세션을 확인하고 sessionInfomation을 확인하여 expired시키는 필터가 ConcurrentSessionFilter
어떤 세션에 대해서 expired시키는지를 관리하는 필터는 SessionManagementFilter이다
SessionManagementFilter는 세션 생성 정책 , 세션 아이디 고정 설정 , 동시접근 허용 문제 , 세션 타임아웃 문제를 설정할 수 있다.
SessionAuthenticationStrategy라는 인터페이스를 가지고 있는데
SessionAuthenticationStrategy의 구현체에는 2가지 분류가 있다 .
1. 동시 접속 문제 해결를 위한 구현체
ConcurrentSessionControlAuthenticationStrategy ,RegisterSessionAuthenticationStrategy
동시 접속에 대한 전략을 결정하는데 사용한다 , 만약 동시 접속을 한명 혹은 두명으로 제한하도록 설정하면 사용자가 초과될 경우 기존의 사용자를 expire시키든지 나중에 접근한 사용자를 expire 시키든지를 설정 할 수 있다.
2.세션 고정 문제 해결을 위한 구현체
AbstractSessionFixationProtectionStrategy , ChangeSessionIdAuthenticationStrategy
한 사용자에 대해서 로그인시 세션을 고정시키거나 로그인 할때마다 새로운 세션을 부여하는 방식을 결정한다.
세션을 고정시키면 유저1이 유저2의 브라우저에 악의적으로 자신이 부여 받은 세션을 심어놓게 되면 유저2가 로그인 할때 세션은
유저 1이 심어 놓은 세션이된다. 그렇게 되면 유저1과 2은 같은 세션을 갖기 때문에 유저2가 로그인을 하면 유저 1도 로그인된 상태로
사이트에 접근할 수 있게 된다 . 그렇기 떄문에 세션을 고정하는 방식보다는 로그인마다 세션을 부여하는 방식을 사용한다.
HttpSecurity에 sessionManagement()로 session관리에 대한 strategy들을 설정할 수 있다.
@Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests(request-> request.antMatchers(“/”).permitAll() .anyRequest().authenticated() ) .formLogin(login-> login.loginPage(“/login”) .permitAll() .defaultSuccessUrl(“/”, false) .failureUrl(“/login-error”) ) .logout(logout-> logout.logoutSuccessUrl(“/”)) .exceptionHandling(error-> error.accessDeniedPage(“/access-denied”) ) .rememberMe(r->r .rememberMeServices(rememberMeServices()) ) //세션 관리에 대한 설정을 위한 메서드 .sessionManagement( s->s.sessionCreationPolicy(SessionCreationPolicy.STATELESS) .sessionFixation(sf ->sf.changeSessionId()) .maximumSessions(1) .maxSessionsPreventsLogin(true) .expiredUrl(“/session-expired”) ) ; }
.sessionManagement()를 보면
1. 세션 생성을 위한 속성
sessionCreationPolicy는 세션의 생성 정책을 정하는데 사용한다 ,
ALWAYS, – 항상 세션을 생성한다.
IF_REQUIRED – 필요할때만 세션을 생성한다.
NEVER – 스프링 시큐리티에서 세션을 생성하지 않지만 세션이 존재한다면 사용.
STATELESS – 모든 요청에 대해 세션을 생성하지 않는다.
보통 ALWAYS , STATELESS 두가지로 설정한다고한다.
ALWAYS는 세션이 필요한 상황에서 설정하고
STATELESS는 세션이 필요없는 ajax로그인 JWT로그인 같은 곳에서 설정한다.
위의 4개가 Enum값으로 있다
sessionFixation() 은 세션의 생성 방식에 대해 정의한다 .
changeSession() : 인증할때마다 새로운 세션아이디를 발급한다 . 다른 모든 세션 속성은 유지된다.
none() : 이전에 만들어진 세션이 사용된다 (세션이 고정된다)
newSession() : 아예 새로운 세션이 만들어진다.
migrateSession() : 디폴트 속성이며 인증시에 세션이 생성되고 이전 세션이 무효화된다 , 이전 세션의 속성이 복사된다.
위에서 말했듯이 보안상 문제가 있어 none은 사용하지 않는다 .
2. 동시 접속 문제 해결를 위한 속성
maximumSession()은 한 유저가 갖을 수 있는 세션의 갯수를 정한다.
maxSessionsPreventsLogin()은 사용자 수를 초과했을시 상황을 정의한다
true일 경우 초과된 사용자에게 로그인을 허용한다. 때문에 이전 사용자가 세션이 만료된다.
false일 경우 초과된 사용자에게 로그인을 허용하지 않는다. 떄문에 초과된 사용자는 로그인 할 수 없게 된다.
expiredUrl() 은 세션 만료시에 보낼 페이지를 정한다.
반응형
[ Spring Security ] 03. 동시 세션제어와 세션 고정보호, 세션 정책 관리
728×90
반응형
인프런에서 진행하는 정수원 강사님의 “스프링 시큐리티 – Spring Boot 기반으로 개발하는 Spring Security” 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다.
[ 동시 세션 제어, 세션 고정 보호, 세션 정책 ]> 동시 세션 제어
동일한 계정으로 인증을 받을 때 생성되는 세션에 허용 개수가 초과 되었을 경우 어떻게 세션을 유지하는 지에 대한 제어를 말한다.
Spring-Security에서는 두 가지 전략으로 동시세션제어를 하게 된다.
default 최대 세션 허용 개수 : 1개
동일한 계정으로 들어온 사용자에 대해서 세션 허용 개수
이전 사용자 세션 만료 사용자 1의 세션은 만료 되고 사용자 2의 세션은 사용가능 하다. 현재 사용자 인증 실패 뒤늦게 들어온 사용자 2의 세션을 차단해서 사용자 1의 세션은 사용가능 하다.
protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .maximumSession(1) // 최대 허옹 가능 세션 수(default 1) .maxSessionsPreventsLogin(true) // 동시 로그인 차단한다 -> true:현재사용자인증실패 // (default)false:기존세션만료 .invalidSessionUrl(“/invalid”) // 세션이 유효하지 않을 때 이동 할 페이지 .expiredUrl(“/expired”) // 세션이 만료된 경우 이동 할 페이지 ; }
이 때 invalidSessionUrl() 과 expiredUrl() 을 모두 설정했을 땐 invalidSessionUrl() 이 우선적용 된다.
false(기존 사용자 세션 만료)로 설정하면 사용자 1과 사용자 2 모두 세션이 실행이 되긴한다.
그러나 현재 사용자의 세션이 만료되었는지 안되었는지 ConcurrentSessionFilter 가 체크를 해서 이전 사용자의 세션을 만료시키게 된다.
This session has been expired (possibly due to multiple concurrent logins being attempted as the same user).
> 세션 고정 보호
공격자가 임의로 JSESSIONID 를 웹에 심어놓고 사용자도 공격자의 세션 쿠키를 사용하게 되면,
사용자와 공격자 모두 동일한 세션을 공유하게 되는 참사가 발생한다.
이런걸 세션 고정 공격이라고 한다.
그래서 Spring-Security는 세션 고정 보호를 제공한다.
사용자가 비록 공격자가 심어놓은 쿠키로 접속을 해서 인증을 시도한다 하더라도, 인증할 때 마다 새로운 세션을 생성하면 새로운 쿠키가 만들어질 거고 공격자가 심어놓은 JSESSIONID 는 달라지기 때문에 사용자의 정보를 공유할 수 없다.
즉, 인증에 성공할 때마다 새로운 세션을 생성되고 새로운 JSESSIONID 를 발급하도록 하는 것이 세션 고정 보호이다.
protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionFixation().changeSessionid() // 기본값, (none, migrateSession, newSession) ; }
여기서 changeSessionid() 는 서블릿 3.1 이상에서의 기본값이고 그 이하 버전에서의 기본값은 migrateSession() 이다.
changeSessionid과 migrateSession 이 두 개의 옵션은 이전 세션의 설정한 여러 속성값들을 그대로 사용할 수 있도록 지원하며
newSession은 이전 세션에서 설정한 여러 속성값들을 사용하지 못하고 새롭게 속성값들을 설정해야 한다는 특징이 있다.
none 옵션은 새롭게 세션을 생성하지 않고, 공격에 취약하다.
> 세션 정책
세션 관리 기능이 작동하는 정책
protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.If_Required) ; }
SessionCreationPolicy.Always : 스프링 시큐리티가 항상 세션을 생성한다.
: 스프링 시큐리티가 항상 세션을 생성한다. SessionCreationPolicy.If_Required : 스프링 시큐리티가 필요 시에 생성한다.( 기본 값 )
: 스프링 시큐리티가 필요 시에 생성한다.( ) SessionCreationPolicy.Never : 스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용한다.
: 스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용한다. SessionCreationPolicy.Stateless : 스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않는다. JWT 이라는 웹 토큰을 이용해 토큰에 사용자의 정보나 추가적인 사항들을 저장하고 인증을 하는 방식이다. 이 때 는 Stateless 옵션을 사용한다.
: 스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않는다.
< SessionManagementFilter, ConcurrentSessionFilter >
추가로 세션 관리에 사용되는 필터들에 대해서 알아보겠다!
SessionManagementFilter 세션 관리 인증 시 사용자의 세션정보를 등록, 조회, 삭제 등의 세션 이력을 관리 동시적 세션 제어 동일 계정으로 접속이 허용 되는 최대 세션 수를 제한 세션 고정 보호 인증할 때마다 세션쿠키를 새로 발급해서 공격장의 쿠키 조작을 방지 세션 생성 정책 Always, If_Required, Never, Stateless
ConcurrentSessionFilter 매 요청마다 현재 사용자의 세션 만료 여부를 체크해서 세션이 만료되었을 경우에는 즉시 만료 처리를 한다. session.isExpired() == true 로그아웃 처리 즉시 오류 페이지 응답 이 필터는 동시적 세션제어를 하기 위해 SessionManagementFilter와 항상 연계되어 있다.
사용자1과 2의 로그인 과정에서 동시적 세션 접근제어를 하는 과정
사용자1이 UsernamePassworddAuthenticationFilter 는 가장 먼저 ConcurrentSessionControlAuthenticationStrategy 클래스를 가장 먼저 호출한다. 이 계정으로 생성된 세션의 개수가 얼마인지 확인한다. 이 때는 session count가 0이므로 문제없이 통과한다. 그 이후 ChangeSessionIdAuthenticationStrategy 클래스를 호출해서 세션 고정 보호를 처리한다. 새롭게 세션을 생성하고 새로운 세션 쿠키를 발급한다. 세 번째로 RegisterSessionAuthenticationStrategy 클래스를 호출해서 사용자의 세션을 등록하고 저장하는 역할을 한다. 이 때 session count가 1이 된다. 이 상태에서 사용자2가 사용자1가 동일한 계정으로 인증을 시도한다. 해당 계정으로 생성된 세션이 한개가 있고, 최대 허용 세션 개수도 1로 똑같으므로 두 가지 전략을 타게 된다. 인증 실패 전략일 경우 SessionAuthenticationException 이 발생하고 인증이 실패가 된다.
이 발생하고 인증이 실패가 된다. 더이상 다른 클래스를 호출하지 않고 인증이 끝나버린다! 이전 사용자의 세션만료 전략일 경우 사용자 1의 세션을 만료 시킨다 : session.expireNow()
사용자 2의 세션을 인증한다 : 똑같이 1,2,3의 과정을 거친다.
이 때 사용자 1이 다시금 자원에 접근을 하게 되면 ConcurrentSessionFilter가 사용자의 세션 만료여부를 체크한다 : session.isExpired() == true
728×90
반응형
Spring Security Session과 CSRF에 대해..
지금까지 스프링 시큐리티의 개요와 인증, 인가에 대해서 정리했었다.
이제 CSRF와 세션에 대한 내용이 남았다. 정리하려고 여기저기 살펴보니, 사실 내용이 많지는 않았다. 그래서 이 포스팅에서 한번에 정리하고자 한다.
사용자의 의지와는 무관한 수정/삭제/등록 등의 행위를 요청하는 것을 의미한다.
스프링 시큐리티에서는 아래와 같은 방법으로 CSRF를 방지한다.
CSRF 방지 기능은 Spring Framework 3.2부터 추가되었다.
Spring Security의 인증 절차를 정상적으로 거쳤다면 아래와 같은 절차로 요청이 이루어진다.
new
new
new
이론상으로는 위 3가지 설정만 해주면 세션 동시성 제어가 된다고 생각할 수 있다.
하지만 로그아웃을 하고 다시 로그인을 하더라도 아래와 같은 에러가 발생한다.
“Maximum sessions of 1 for this principal exceeded”
[Spring Boot] Spring Security 세션 인증 정책 예제
[Spring Boot] Spring Security 사용자 정의 보안 기능 구현 사용자 정의를 위한 구조 SpringSecurity의 설정을 직접 구현하면 보안관련 설정을 사용자화 할 수 있다. SecurityConfig 객체를 생성하여 WebSecurityConfigurerAdapter 을 상속 받아 configure 메서드를 override 한다. WebSecurityConfigurerAdapter 스프링 시큐리티의 웹 보안 기능을 초기화하고 설정을 담당하는 클래스이다. 기본적인 보안 기능을 활성화 하고 시스템에 보안 기능이 작동하게 하기 위한 모든 설정을 처리 한다. HttpSecurity 세부적인 보안 기능을 설정할 수 있는 API를 제공한다. SecurityConfig 사용자 정의 보안 설정 클래스이다.(정해져있는 클래스명은 아님) 아래의 EnableWebSecurity 어.. 공감수 1
[spring boot] 스프링 시큐리티 세션 활용하기
게시글 작성에서 기존의 방식은 사용자가 글 제목, 작성자, 글 내용을 직접 입력해야했습니다. 그러나 로그인한 사용자의 이름을 게시글 작성자로 설정해두고 싶습니다. 이 처리를 위해서는 세션이 필요하다고 생각했고 관련 자료들을 찾게 되었습니다.
HttpSession 활용하기
https://pro-pennek.tistory.com/entry/Spring-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC%EC%97%90%EC%84%9C-%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A1%9C-Session%EA%B0%92-%EB%84%98%EA%B8%B0%EA%B8%B0
이 게시글에서 얻게 된 내용입니다. View 쪽에서 세션값을 지정해주고 Controller에서 session.getAttribute로 가져오는 방식입니다.
이 방법도 그럴싸했으나 하나의 의문이 들었습니다. SecurityConfig에서 분명히 로그아웃을 하면 세션 초기화하도록 지정해둔 기억이 났습니다.
.invalidateHttpSession(true)
세션이란게 있기에 이걸 삭제하고 그런거 아닐까요? 여기서 스프링 시큐리티 측에서 세션을 따로 관리하고 있다고 추측을 했습니다.
세션 확인해보기
개발자 도구 -> Application -> Storage -> Cookie 에 들어가 “JSESSIONID” 키가 존재하는 것을 확인할 수 있었습니다.
세션 활용하기
Spring Security에서 로그인한 사용자의 정보를 가져오는 방법에 대해서 정리해보겠습니다.
SecurityContextHolder
저는 이미 로그아웃을 구현하면서 이걸 쓴 기억이 있습니다. 조금 더 디테일하게 들어가면 사용자의 이름을 얻을 수 있습니다.
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); User user = (User)principal; String username = principal.getUsername();
Principal & Authentication 객체 활용
제가 사용한 방법입니다. 컨트롤러단에서 매개변수로 받아서 사용하는 방식입니다. 사용자 이름을 받아와서 model.addAttribute를 통해 view단에 이름을 넘겨줬습니다.
@GetMapping(“/board/post”) public String post(Model model,Authentication authentication) { UserDetails userDetails = (UserDetails) authentication.getPrincipal(); model.addAttribute(“author”,userDetails.getUsername()); return “board/post.html”; }
@GetMapping(“/”) public String username(Principal principal) { System.out.println(principal.getName()); retutn “/”; } //Principal 객체 활용하는 방법
게시글 작성 view 수정
p 태그를 통해서 author 정보를 받아와서 display 해줍니다. 그러나 저는 form으로 전달된 정보들을 그대로 받아와서 데이터베이스로 저장하기 떄문에 작성자 정보를 넘겨주지 않으면 문제가 생기게 됩니다. 따라서 hidden 타입으로 author값을 넘겨주도록 수정했습니다.
참고
https://itstory.tk/entry/Spring-Security-%ED%98%84%EC%9E%AC-%EB%A1%9C%EA%B7%B8%EC%9D%B8%ED%95%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0
Spring Security : Session 정책 설정
반응형
이 글은 인프런 정수원님의 강의를 복습하며 작성한 글입니다.
Spring Security Session 정책
Spring Security는 Session을 관리하는 정책을 API로 설정할 수 있다. 이 정책은 여러 경우에 필요할 수 있게 되는데, 예를 들어 JWT를 통한 인증을 할 때는 세션을 사용하지 않기 때문에 Spring Security에서 항상 세션을 생성하지 않아야 한다. 이런 경우들이 존재할 수 있기 때문에 Spring Security는 손쉽게 Session 정책을 설정할 수 있도록 돕는다.
Session 정책 API 설정
http.ssessionManagement() : 세션 설정 시작
sessionCreationPolicy() : 세션 생정 정책을 설정한다. SessionCreationPolicy.Always : 세션을 항상 생성한다. SessionCreationPolicy.If_Required : 필요할 때만 세션을 생성한다. (기본값) SessionCreationPolicy.Never : 세션을 생성하지 않는다. 이전에 생성된 세션은 사용한다. SessionCreationPolicy.Stateless : 세션을 생성하지도, 사용하지도 않는다.
Stateless 정책은 세션을 사용하지 않는 인증방식을 도입할 때 사용한다. JWT 토큰 같은 것들로 인증을 처리할 떄 사용할 수 있다.
http .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.ALWAYS);
다음과 같이 API를 통해 손쉽게 설정할 수 있음.
반응형
Spring Security #2 다양한 사용법 – 익명사용자, 세션 제어, 예외처리
아래의 보안 기능들은 직접 구현하고자하면 상당히 귀찮다.
스프링 시큐리티에서는 간단한 설정 값을 통해 다양한 기능을 사용할 수 있다.
💭 익명 사용자 필터 (AnonymousAuthenticationFilter)
이름 그대로 현재 사용자가 인증(로그인)이 되어있는지, 아닌지를 판단하는 필터이다.
스프링 시큐리티에서는 익명 사용자라고 할지라도, 인증개체를 null로 처리하지 않고 [익명 사용자 토큰]을 생성한다.
인증객체가 null이라면 SecurityContext만으로는 익명사용자가 있는지, 아예 접속을 하지 않은건지 구분할 수 없다.
익명사용자 토큰을 통해 인증 여부에 따른 다른 화면을 구현할 때, 아래와 같은 메서드를 사용해서 쉽게 만들 수 있다.
isAnonymous() – 익명 사용자인가? (페이지에 로그인 메뉴 표시)
isAuthenticated() – 로그인된 사용자인가? (페이지 로그아웃 메뉴 표시)
물론 첫 접속에서 익명 사용자 토큰(인증객체)가 생성되었다면 이후 만료되기 전까지는 해당필터는 동작하지 않는다.
인증객체가 null일때만 AnonymousAuthenticationFilter가 동작한다.
💭 세션 관리 필터 (SessionManagementFilter)
📑 동시 세션 제어 (동일계정 중복접속)
한 계정으로 여러 컴퓨터에서 접속하는 경우, 세션은 여러 개가 생성될 수 있다.
이를 스프링 시큐리티에서는 http.sessionManagement()를 이용해서 간단하게 처리할 수 있다.
maxSessionPreventsLogin(true)를 하게되면 아래 그림의 [2. 현재사용자 인증실패] 처럼 동작한다.
한 계정으로 여러 곳에서 접속했을 때 어떻게 처리할지 정할 수 있다. default값은 [1. 세션만료]이다.
이는 ConcurrentSessionFilter 를 통해 동작하게된다. 필터의 동작은 앞 글에서 많이 다뤘으므로, 궁금하면 구글 검색하자
2021.11.22 – [🌱Backend/Spring Security] – Spring Security #1 기본동작 이해하기
📑 세션 고정 보호 (세션 주입 공격, sessionFixation)
보통 웹 서비스는 로그아웃 후 바로 다시 로그인을 하더라도 기존의 JSESSIONID를 재사용하지 않고 새로 발급한다.
스프링 시큐리티도 마찬가지로 세션에 기존의 인증개체가 있더라도 로그인을 요청하면 JSESSIONID는 새로 발급한다.
기존의 값을 이용해도 될거같은데, 번거롭게 로그인 요청마다 새롭게 발급하는 이유는 무엇일까?
이는 세션고정공격 (SessionFixation)으로 인한 세션 하이재킹(세션 탈취)를 막기 위함이다.
만약 아래와 같이 공격자가 먼저 로그인을 한 후, 사용자 컴퓨터에 JSESSIONID 쿠키를 심어놓았다고 가정해보자.
이를 세션 고정 공격을 통한 세션 하이재킹이라고 한다.
이를 세션 고정 공격이라고 한다.
당연히 스프링 시큐리티에서는 세션고정보호(changeSessionId)가 기본적용되어있으며, 이는 설정에서 변경할 수 있다.
newSession()은 이전 세션에서 설정한 인증개체의 속성 값도 초기화한다. (인증개체 clear)
물론 이를 변경 할 일은 거의 없다. 사용하지 않더라도 알고는 있도록 하자.
😒 : 원래 웹은 JSESSIONID를 매번 새롭게 발급해주는건가요?
🙄 : 어…잘모르겠는데 돌려보니까 그렇더라구요. 아마 그렇지 않을까요? (???)
📑 세션 정책 변경
웹 서비스에 따라 따로 사용자 인증이 필요 없는 경우, 세션이 필요없을 수도 있다.
또는 JWT토큰 등을 사용하면 서버에 아예 세션을 생성하지 않기 때문에 세션을 만들 필요가 없다.
이럴 때는 스프링 시큐리티의 세션 정책(sessionManagement().SessionCreationPolicy)을 통해 쉽게 설정할 수 있다.
Never는 생성은 안하지만, 사용은 한다. [JWT 토큰]처럼 세션이 아예 필요없다면 Stateless를 사용하자.
📑 정리 (SessionManagementFilter)
기본적인 세션관리
동시적 세션 제어
세션 고정 보호 (sessionFixation)
세션 생성 정책 (Always, If_Required, Never, Stateless)
참고로 이 과정에서는 SessionManagementFilter와 함께 ConcurrentSessionFilter도 사용된다.
📑 ConcurrentSessionFilter, 전체 동작흐름
ConcurrentSessionFilter는 매 요청마다 현재 사용자의 세션 만료 상태를 확인하며, 만료인 경우 즉시 처리를 한다.
로그아웃에 필요한 처리
오류페이지 응답 (필터체인으로 넘기지 않고 ConcurrentSessionFilter 에서 즉시 응답)
그래서 앞에서 배웠던 UsernamePasswordAuthenticationFilter, SessionManagementFilter와 함께 보면 아래 그림과 같다.
설정값을 통해 SessionManagementFilter 안에 있는 Strategy 의 구현체를 쉽게 바꿀 수 있다.
💭 인가 API
인증(Authentication)은 ‘내가 누구인지’ 확인하는 작업, 로그인을 의미한다.
인가(Authorization)는 ‘내가 누구인지는 알지만, 권한이 있는지 확인하는’ 작업이다.
스프링 시큐리티는 인가, 즉 접근 권한 설정을 선언적 방식과 동적 방식으로 제공해준다.
스프링 시큐리티는 특정 메서드에도 접근 권한을 설정해줄 수 있다.
📑 사용자 생성 및 권한(Role) 부여
configure 메서드를 이용해서 테스트용 사용자를 쉽게 만들 수 있다.
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 물론 테스트 용도로 사용하는거지, 실제 사용은 동적으로 DB와 연동해서 계정을 생성한다. auth.inMemoryAuthentication().withUser(“user”).password(“{noop}1111”).roles(“USER”); auth.inMemoryAuthentication().withUser(“system”).password(“{noop}1111”).roles(“SYS”); auth.inMemoryAuthentication().withUser(“admin”).password(“{noop}1111”).roles(“ADMIN”); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() // 인가, 권한이 필요한 요청 URL .antMatchers(“/user”).hasRole(“USER”) // user만 접근가능 .antMatchers(“/admin/pay”).hasRole(“ADMIN”) // admin만 접근가능 .antMatchers(“/admin/**”).access(“hasRole(‘ADMIN’) or hasRole(‘SYS’)”) // system,admin만 .anyRequest().authenticated(); // 그 외 모든 요청은 인증만 필요. http.formLogin(); } }
URL 설정은 구체적인 경로를 먼저 작성해야한다.
참고로 포함관계 (System은 Admin과 User권한을 포함)라면 아래와 같이 작성해주어야한다.
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser(“user”).password(“{noop}1111”).roles(“USER”); auth.inMemoryAuthentication().withUser(“system”).password(“{noop}1111”).roles(“USER”,”SYS”); auth.inMemoryAuthentication().withUser(“admin”).password(“{noop}1111”).roles(“ADMIN”,”SYS”,”USER”); }
다만 스프링 시큐리티에는 권한 계층 기능이 있어서 이렇게 일일이 지정하지 않아도 포함관계를 쉽게 설정할 수 있다.
📑 URL 권한 설정(인가)
참고로 권한 설정을 하는 메서드는 아래와 같다.
메소드 동작 authenticated() 인증된 사용자의 접근을 허용 fullyAuthenticated() 인증된 사용자의 접근을 허용 , rememberMe 인증 제외 permitAll() 무조건 접근을 허용 ( 모두가 접근 가능 ) denyAll() 무조건 접근을 허용하지 않음 anonymous() 익명사용자의 접근을 허용 (* 주의 * 인증된 USER 는 접근할 수 없음 ) rememberMe() 기억하기를 통해 인증된 사용자의 접근을 허용 access(String) 주어진 SpEL (Spring Exp Lang) 표현식의 평가 결과가 true 이면 접근을 허용 hasRole(String) 사용자가 주어진 역할이 있다면 접근을 허용 (User) hasAuthority(String) 사용자가 주어진 권한이 있다면 (Role User) hasAnyRole(String…) 사용자가 주어진 권한이 있다면 접근을 허용 hasAnyAuthority(String…) 사용자가 주어진 권한 중 어떤 것이라도 있다면 접근을 허용 hasIpAddress(String) 주어진 IP 로부터 요청이 왔다면 접근을 허용
💭 인증,인가 예외처리 – ExceptionTranslationFilter
참고로 스프링 시큐리티의 마지막 필터 체인은 항상 FilterSecurityInterceptor 필터로 끝난다.
이 필터 앞에 위치하는게 ExceptionTranslationFilter인데, 코드를 살펴보면 사용자 요청을 받을 때
try-catch로 FilterSecurityInterceptor를 감싸고 있다. 즉 예외처리를 여기서 담당한다.
이 필터 역시 간단하게 사용할 수 있다.
AuthenticationException
1. AuthenticationEntryPoint를 호출한다. (로그인 페이지로 이동, 401 오류코드 전달 등을 담당)
2. 인증 예외가 발생하기 전의 요청 정보를 저장한다.
➡ RequestCache – 사용자의 이전 요청정보를 세션에 저장하고, 이를 꺼내오는 캐시 메커니즘
➡ RequestCache 내부의 SavedRequest 객체 – 사용자가 요청했던 request 속성, 헤더들을 저장.
1. AuthenticationEntryPoint를 호출한다. 2. 인증 예외가 발생하기 전의 요청 정보를 저장한다. AccessDeniedException
인가에 관련된 예외를 처리한다.
특별한 동작은 없고 AccessDeniedHandler 에서 예외처리를 하도록 제공한다.
참고로 ‘익명사용자’ 도 인증개체가 존재하기때문에, 인증예외가 아니라 인가예외가 발생한다.
RequestCache는 아래와 같이 사용할 수 있다.
protected void configure(HttpSecurity http) throws Exception { http.exceptionHandling() // 예외처리 핸들러 등록 (람다함수 사용) .authenticationEntryPoint( (request, response, authException) -> response.sendRedirect(“/login”)) .accessDeniedHandler( (request, response, accessDeniedException) -> response.sendRedirect(“/denied”)); http.formLogin() .successHandler((request, response, authentication) -> { RequestCache requestCache = new HttpSessionRequestCache(); // 인증 예외가 발생하기 전 캐시된 Request 객체 SavedRequest savedRequest = requestCache.getRequest(request, response); String redirectUrl = savedRequest.getRedirectUrl(); // 기존에 가고자 했던 URL response.sendRedirect(redirectUrl); }); }
RequestCacheFilter에서 이전의 Request 객체(savedRequest)를 세션에 캐싱하고 다음 필터로 넘긴다. 그리고 사용하는 시점에서 request.session에 있는 savedRequest를 꺼낸다.
[Spring Security] 스프링 시큐리티 기본 API 및 Filter 이해
스프링 시큐리티 기본 API 및 Filter 이해
프로젝트 구성 및 의존성 추가
org.springframework.boot spring-boot-starter-security 스프링 시큐리티의 의존성 추가 시 일어나는 일들
서버가 기동되면 스프링 시큐리티의 초기화 작업 및 보안 설정이 이루어진다 별도의 설정이나 구현을 하지 않아도 기본적인 웹 보안 기능이 현재 시스템에 연동되어 작동함
모든 요청은 인증이 되어야 자원에 접근이 가능하다
인증 방식은 폼 로그인 방식과 httpBasic 로그인 방식을 제공한다
기본 로그인 페이지를 제공한다
기본 계정을 한개 제공한다 – username : user / password : 랜덤 문자열
문제점
계정 추가, 권한 추가, DB연동 등 기본적인 보안 기능 외에 시스템에서 필요로 하는 더 세부적이고 추가적인 보안 기능이 필요
사용자 정의 보안 기능 구현
SecurityConfig 설정
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin(); }
WebSecurityConfigurerAdapter를 상속받은 SecurityConfig 클래스에서는 사용자가 직접 보안 설정을 정의 할 수 있다
Form Login 인증
클라이언트와 서버간의 관계속에서 스프링 시큐리티가 인증처리 프로세스
사용자가 GET방식으로 /home 자원에 접근한다 사용자가 인증을 받지 않은 경우 로그인 페이지로 리다이렉트 (실패) POST 방식으로 인증을 시도 (성공) 서버에서는 스프링 시큐리티가 세션을 생성하게 되고 그 세션에 Authorization 객체를 생성해서 저장한다 (SecurityContext에 저장한다) 인증을 받은 이후 /home 자원에 접근을 시도하면 스프링 시큐리티는 사용자가 가진 세션으로부터 토큰의 존재여부를 판단 후 자원에 접근한다, 스프링 시큐리티는 세션에 저장된
인증토큰이 있다면 사용자가 인증된 사용자라고 판단하고 인증을 유지한다
Form Login 인증 API
protected void configure(HttpSecurity http) throws Exception { http formLogin() .loginPage(“/login.html”) // 사용자 정의 로그인 페이지 .defaultSuccessUrl(“/home) // 로그인 성공 후 이동 페이지 .failureUrl("/login.html?error=true“) // 로그인 실패 후 이동 페이지 .usernameParameter(“username”) // 아이디 파라미터명 설정 .passwordParameter(“password”) // 패스워드 파라미터명 설정 .loginProcessingUrl(“/login”) // 로그인 Form Action url .successHandler(loginSuccessHandler()) // 로그인 성공 후 핸들러 .failureHandler(loginFailureHandler()) // 로그인 실패 후 핸들러 }
UsernamePasswordAuthenticationFilter
인증처리를 담당하고 인증처리에 요청을 처리하는 필터가 UsernamePasswordAuthenticationFilter이다 내부적으로 각각의 인증처리의 역할을 통해 인증처리를 하게 된다
사용자가 Request 사용자의 요청정보를 UsernamePasswordAuthenticationFilter가 확인한다 AntPathRequestMatcher가 요청 정보가 매칭되는지 확인한다 매칭이 되면 인증처리, 매칭이 되지 않으면 필터로 이동한다 Authentication 객체를 생성해서 사용자가 로그인 할 때 입력한 정보를 저장한다 AuthenticationManager (인증관리자) 가 필터로부터 인증 객체를 전달 받고 인증을 하게 된다 AuthenticationProvider에게 인증을 위임한다 (실질적으로 인증을 하는 클래스) 인증이 실패하면 AuthenticationException (인증예외) 를 발생시켜 다시 필터가 받아 예외 후속작업을 실행 인증이 성공하면 Authentication 객체를 생성해서 AuthenticationManager에게 리턴한다 AuthenticationManager는 전달받은 인증 객체를 다시 Filter 에게 리턴한다 Filter는 인증을 처리한 이후에 Authentication 객체를 전달받고 인증 객체를 SecurityContext에 저장한다(인증 객체 저장소, 전역으로
Authentication 객체를 참조 가능) SuccessHandler에서 인증 성공 이후 작업를 진행
크게 인증을 하기 전 작업 , 인증 후 작업으로 나뉘는데 그 분기점은 AuthenticationManager이다.
Logout 처리, LogoutFilter
protected void configure(HttpSecurity http) throws Exception { http.logout() // 로그아웃 처리 .logoutUrl("/logout") // 로그아웃 처리 URL .logoutSuccessUrl("/login") // 로그아웃 성공 후 이동페이지 .deleteCookies("JSESSIONID“, "Remember-Me") // 로그아웃 후 쿠키 삭제 .addLogoutHandler(logoutHandler()) // 로그아웃 핸들러 .logoutSuccessHandler(logoutSuccessHandler()) // 로그아웃 성공 후 핸들러 }
클라이언트가 POST 방식으로 로그아웃 요청 AntPathRequestMatcher가 로그아웃 요청을 확인한다 일치하면 인증객체를 담고 있는 SecurityContext를 Authentication로 꺼내온다 SecurityContextLogoutHandler가 세션 무효화, 쿠키 삭제, 인증 객체 NULL 처리, securityContext.clearContext() 컨텍스트에서
정보를 삭제 로그아웃이 성공하면 SimpleUrlLogoutSuccessHandler를 호출에 로그인 페이지로 이동하도록 한다
Remember Me 인증
protected void configure(HttpSecurity http) throws Exception { http.rememberMe() .rememberMeParameter(“remember”) // 기본 파라미터명은 Remember-Me .tokenValiditySeconds(3600) // Default 는 14일 .alwaysRemember(true) // 리멤버 미 기능이 활성화되지 않아도 항상 실행 .userDetailsService(userDetailsService) }
세션이 만료되고 웹 브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는 기능 Remember-Me 쿠키에 대한 Http 요청을 확인한 후 토큰 기반 인증을 사용해 유효성을 검사하고 토큰이 검증되면 사용자는 로그인 된다 사용자 라이프 사이클
인증 성공 (Remember-Me 쿠키 설정)
인증 실패 (쿠키가 존재하면 쿠키 무효화)
로그아웃 (쿠키가 존재하면 쿠키 무효화)
JSESSIONID가 없더라도 스프링 시큐리티에서는 Remember-Me 쿠키가 있다면 다시 인증을 시도하고 JSESSIONID를 다시 생성한다
RememberMeAuthenticationFilter
RememberMeAuthenticationFilter가 정상적으로 작동하는 조건
인증객체가 없는 경우 사용자가 Remember-Me 쿠키를 가지고 오는 경우
RememberMeAuthenticationFilter가 요청을 처리하는 조건은 Authentication이 NULL일 경우이다
ex) 사용자의 세션이 만료되었거나 브라우저가 종료되어 시큐리티 컨텍스트를 찾지 못하는 경우
Remember-Me 인증 절차
Remember-Me를 가지고 있는 세션이 만료된 사용자가 요청 RememberMeAuthenticationFilter가 동작한다 RememberMeService가 인증을 시도 (각 구현체가 Remember-me 인증 처리 역할을 한다)
TokenBasedRememberMeServices 토큰을 비교해서 인증처리
PersistentTokenBasedRememberMeServices DB에 저장한 토큰을 비교해서 인증처리
RememberMeService가 토큰을 추출한다 Decode Token(정상 유무 판단) 토큰의 일치여부를 확인한다
정상이 아닐 경우 예외 발생
토큰에 포함된 User 정보를 통해 현재 DB에 저장된 User를 조회하여 해당 쿠키에 포함된 유저에 해당하는지를 확인한다
User 계정이 존재하지 않을 경우 예외 발생
새로운 Authentication 객체를 생성한다 Authentication 인증 객체를 AuthenticationManager 에게 전달하여 인증 처리를 하게 된다
AnonymousAuthenticationFilter
사용자가 요청한다 AnonymousAuthenticationFilter가 요청을 받는다 현재 요청한 사용자가 SecurityContext에 저장되어 있는 인증 객체가 존재하는지를 판단
인증 객체가 존재하면 다음 필터로 이동한다
인증 객체가 존재하지 않는 경우 인증을 거치지 않은 사용자로(익명 사용자) 판단하고 AnonymousAuthenticationToken(익명 객체) 생성 SecurityContext에 AnonymousAuthenticationToken를 저장
AnonymousAuthenticationFilter는 익명 사용자라고 판단하고 익명 사용자용 토큰을 만들어서 인증 사용자와의 구분을 위함
동시 세션 제어, 세션 고정 보호, 세션 정책
protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .maximumSessions(1) // 최대 허용 가능 세션 수 , -1 : 무제한 로그인 세션 허용 .maxSessionsPreventsLogin(true) // 동시 로그인 차단함, false : 기존 세션 만료(default) .invalidSessionUrl(“/invalid”) // 세션이 유효하지 않을 때 이동 할 페이지 .expiredUrl(“/expired “) // 세션이 만료된 경우 이동 할 페이지 }
동시 세션 제어 전략
이전 사용자 세션 만료 현재 사용자 인증 실패
세션 고정 보호
protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionFixation().changeSessionId() // 기본값 // none, migrateSession, newSession }
사용자는 공격자가 심어놓은 쿠키로 로그인을 시도하더라도 인증할 때 마다 새로운 세션이 생성되고 새로운 쿠키가 생성되어 보호한다
세션 정책
protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy. If_Required ) }
SessionCreationPolicy. Always : 스프링 시큐리티가 항상 세션 생성
SessionCreationPolicy. If_Required : 스프링 시큐리티가 필요 시 생성(기본값)
SessionCreationPolicy. Never : 스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용
SessionCreationPolicy. Stateless : 스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않음
세션 제어 필터
SessionManagementFilter의 기능과 역할
세션 관리
인증 시 사용자의 세션정보를 등록,조회 삭제 등의 세션 이력을 관리
동시적 세션 제어
동일 계정으로 접속이 허용되는 최대 세션수를 제한
세션 고정 보호
인증 할 때마다 세션쿠키글 새로 발급하여 공격자의 쿠키 조작을 방지
세션 생성 정책
Always. if_Required, Never, Stateless
ConcurrentSessionFilter
매 요청마다 현재 사용자의 세션 만료 여부 체크 세션이 만료되었을 경우 즉시 만료 처리
session.isExpired() == true 로그아웃 처리 즉시 오류 페이지 응답 (“This session has been expired”)
권한 설정 및 표현식
@Override protected void configure(HttpSecurity http) throws Exception { http .antMatcher(“/shop/**”) .authorizeRequests() .antMatchers(“/shop/login”, “/shop/users/**”).permitAll() .antMatchers(“/shop/mypage”).hasRole(“USER”) .antMatchers(“/shop/admin/pay”).access(“hasRole(‘ADMIN’)”) .antMatchers(“/shop/admin/**”).access(“hasRole(‘ADMIN’) or hasRole(‘SYS ‘)”) .anyRequest().authenticated() } // 주의 사항 – 설정 시 구체적인 경로가 먼저 오고 그것 보다 큰 범위의 경로가 뒤에 오도록 해야 한다
선언적 방식
URL http.antMatchers(“/users/**”).hasRole(“USER”)
Method @PreAuthorize(“hasRole(‘USER’)”)
public void user(){ System.out.println(“user”)}
동적 방식 – DB 연동 프로그래밍
URI
Method
예외처리 및 요청 캐시 필터
AuthenticationException
인증 예외 처리 AuthenticationEntityPoint 호출 로그인 페이지 이동, 401 오류 코드 전달 등 인증 예외가 발생하기 전의 요청 정보를 저장 RequestCache – 사용자의 이전 요청 정보를 세션에 저장하고 이를 꺼내 오는 캐시 매커니즘 SavedRequest – 사용자가 요청했던 request 파라미터 값들, 그 당시의 헤더값들 등이 저장
AccessDeniedException
인가 예외처리 AccessDeniedHandler 에서 예외 처리하도록 제공
protected void configure(HttpSecurity http) throws Exception { http.exceptionHandling() .authenticationEntryPoint(authenticationEntryPoint()) // 인증실패 시 처리 .accessDeniedHandler(accessDeniedHandler()) // 인증실패 시 처리 }
사이트 간 요청 위조
로그인 후 쿠키를 발급 받음 링크를 이용자에게 전달 링크를 클릭하여 공격용 웹 페이지에 접속 사용자가 공격용 페이지를 열면, 브라우저는 이미지 파일을 받아오기 위해 공격용 URL을 연다 사용자의 승인이나 인지 없이 배송지가 등록됨으로써 공격이 완료된다
CsrfFilter
모든 요청에 랜덤하게 생성된 토큰을 HTTP 파라미터로 요구
요청 시 전달되는 토큰 값과 서버에 저장된 실제 값과 비교한 후 만약 일치하지 않으면 요청은 실패한다 Client input type=”hidden” name=”${_csrf.parameterName}” value=”${_csrf.token}”/> HTTP 메소드 : PATCH,POST,PUT,DELETE Spring Security http.csrf() : 기본 활성화되어 있음 http.csrf().disabled() : 비활성화
Spring Security (1) – 로그인 세션
// LoginController.java @Controller public class LoginController . java { @Autowired LoginService loginService ; @RequestMapping ( value = “/loginProcess” ) public String loginProcess ( HttpSession session , @RequestParam ( value = “id” ) String id , @RequestParam ( value = “pw” ) String pw ) { if ( loginService . loginCheck ( id , pw )){ // id,pw검사를 통해 True,false를 return session . setAttribute ( “loginCheck” , true ); session . setAttribute ( “id” , id ); return “index” ; } else { return “login” ; } } @RequestMapping ( value = “/logoutProcess” ) public String logoutProcess ( HttpSession session ) { session . setAttribute ( “loginCheck” , null ); session . setAttribute ( “id” , null ); return “index” ; } @RequestMapping ( value = “/needLogin” ) public String needLoginPage ( HttpSession session ) { //세션 검사를 통해 Access control if ( session . getAttribute ( “loginCheck” )!= null ){ return “needLogin” ; } else { return “login” ; } } }
키워드에 대한 정보 spring security session 관리
다음은 Bing에서 spring security session 관리 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 스프링 보안 동시 세션
- springsecuritytutorials
- springboot
- springmvc
- security
- session
- httpsession
- sessionmanagement
- springframework
- springcore
- springsecurity
- spring framework
- spring security
- spring boot
- spring securityt tutorials
- spring mvc
- spring framework tutorial for beginners
- spring framework tutorial
- spring security tutorial
- spring security tutorial for beginners
스프링 #보안 #동시 #세션
YouTube에서 spring security session 관리 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 스프링 보안 동시 세션 | spring security session 관리, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.