본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


반응형

Spring Security

(16)
스프링 시큐리티 공부 19 - JWT 을 이용한 로그인 세션을 이용한 로그인에서는 로그인 성공시 사용자에게 세션을 부여하여 해당 세션이 살아있는 동안 로그인이 유지된 상태로 사이트 리소스에 접근할 수 있게 하듯이 JWT를 사용할때도 같은 역할을 해줄 수 있어야한다 . JWT는 로그인시 발급 받은 토큰으로 매번 요청에 대해서 토큰의 claim을 확인하여 리소스 접근여부를 결정한다 (Authentication을 발급해준다.) JWT를 이용해서 로그인을 시키고 로그인을 유지시키는 방법을 알아보자 먼저 로그인을 시키고 토큰을 발급해주는 것은 POST /login 요청으로 들어오는 데이터(username , password)를 통해 인증 하는 UsernamePasswordFilter를 상속받아서 필요한 로직을 추가하는 방식으로 구현해 보려한다 . JWT를 생성,인증 ..
스프링 시큐리티 공부 18 - JWT (Json Web Token) JWT란 ? https://jwt.io/introduction JWT.IO JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties. jwt.io 서버에서 인증된 사용자가 인증을 유지해주는 방법으로 보통은 세션을 사용한다 . 서버 세션을 사용하면 인증된 사용자는 편리하게 서비스를 이용할 수 있고 , 대부분의 웹애플리케이션 서버가 세션을 지원하기 때문에 편리하다 , 하지만 scale out 같이 사용자가 서로 다른 도메인의 데이터를 요청할 경우 sso에는 세션을 유지하기 위한 비용이 매우 커지게 된다 . 세션으로 서버에 사용자 정보를 저장하는 대신 클라이언트..
스프링 시큐리티 공부 15 - WebExpressionVoter 와 PreinvocationAuthorizationAdviceVoter 기본적으로 권한에서 가장 중요한 역할을 하는 것은 AccessDicisionManager를 구현해서 처리할 수 있다. 하지만 기존에 잘 구현된 소스들을 활용할려면 Voter 기반의 AccessDecisionManager를 사용하는 것이 좋다 . Affirmativebased(하나만 통과 시켜도 통과) , ConsensusBased(다수결 위원회) , UnanimouseBased(만장일치) 로 Voter의 정책을 정할 수 있지만 보통 Affirmativebased를 사용한다 . 권한 심사에 참여하는 Vote의 종류에는 FilterSecurityInterceptor 가 사용하는 WebExpressionVoter와 GlobalMethodSecurityInterceptor에서 사용하는 RoleVoter, Aut..
스프링시큐리티 공부 15 - 권한이란? 스프링 시큐리티에서 중요한 2가지 개념 중 하나이다 사용자에 SecurityFilter를 거쳐 인증을 얻었다면 필터마지막에서 FilterSecurityInterceptor 혹은 서블릿단에서 특정 메서드에 어노테이션(MethodSecurityInterceptor) 를 통해 권한을 체크하게 된다. 스프링 시큐리티에서 권한에 대한 처리들은 스프링 AOP를 기반으로 동작한다 . DI(의존성주입) 과 함께 스프링의 주요 철학인 AOP(Aspenct Oriented Programming 관점지향 프로그래밍)은 스파게티 코드(여러 관심사 가 스파게티처럼 엮여있는 코드)에서 벗어나 관심사를 분리하여 , 같은 관심사를 갖는 코드끼리 따로 관리하는 프로그래밍 철학이다 . 스프링에서는 AOP를 구현하기 위해 아래와 같은 개..
스프링시큐리티 공부 14 - FilterSecurityInterceptor 와 ExceptionTranslationFilter securityInterceptor에 대해서는 권한에 대해 알아볼때 자세히 알아봐야겠다 . 간단히만 정리하면 securityInterceptor 는 FilterSecurityInterceptor 와 MethodSecurityInterceptor로 나뉜다. FilterSecurityInterceptor는 필터단에서 동작하고 MethodSecurityInterceptor는 메소드에서 선언하고 스프링 어플리케이션안 서블릿단에서 동작한다. 두 클래스는 공통 클래스인 AbstractSecurityIntercepotor를 구현하고 있다 AbstractSecurityIntercepotor의 가장 중요한 멤버 변수는 AccessDecisionManager인데 인증에서 AuthenticationManager가 사용자 인..
스프링시큐리티 공부 13 - 세션관리 (세션 모니터링) 이전 시간에 공부한 것을 토대로 현재 세션을 리스트를 출력해주고 세션을 expire시킬 수 있는 세션 모니터링 페이지를 만들어보자 . 먼저 thymeleaf로 세션 리스트 출력과 세션 종료를 위해 세션 아이디를 전송해 주는 폼을 갖는 뷰와 , 세션 종료시 보낼 session-expired 뷰를 준비했다. sessionList.html 테이블에서 서버에서 보낸 sesstionList를 뿌려 주고 있다. form 에서는 session 종료를 위해 session Id를 서버로 전송한다. 유저 sessionId 마지막 요청 시간 세션 유효 여부 username sessionId time 강제 종료 sessionExpired.html 간단하게 세션 만료 텍스트와 메인페이지로 보내는 링크가 있다. 접근 권한이 없습..
스프링시큐리티 공부 12 - 세션관리 (ConcurrentSessionFilter) 스프링이 SecurityContextHolder를 유지하기 위한 방법중 하나는 session을 활용하여 SecurityContextHolder를 유지하는 방법이다 . 지금까지 공부했던 formLogin 방식이 session 기반으로 동작하는 대표적인 로그인 방식이다 . SecurityContextHolder를 알아봤으니 이제 스프링이 SecurityContextHolder을 유지할 때 사용하는 session에 대해 알아보자 . ConcurrentSessionFilter session은 톰캣과 같은 서블릿 컨테이너에서 제공하는 것이기 떄문에 스프링이 세션을 제어할 수는 없고 톰캣이 넘겨주는 세션을 스프링은 sessionInformation이라는 랩퍼객체를 만들어 SessionRegistry에서 관리한다. ..
스프링시큐리티 공부 11 - 로그인 유지 (session과 remberme cookie) 스프링이 지원하는 로그인 방식들 중에 자주 사용하는 4가지 - 폼 로그인 (UsernamePasswordAuthentication 사용 하여 서버사이드 랜더링에서 폼 전송 방식으로 로그인) - ajax 로그인 (Basic Authentication을 사용하여 SPA 또는 모바일 환경에서 요청 헤더에 토큰을 담아서 로그인하는 방식(헤더에 직접 아이디 비밀번호를 담기 때문에 보안에 취약)) - OAuth2 로그인 (OAuth2 규약에 따라 만들어진 로그인 API에 로그인을 위임하는 방식) - JWT 토큰 로그인 ( SPA , 모바일 환경에서 JWT(Json Web Token)을 생성하여 인증하는 방식 ) 그 외 :saml2(인증 정보가 담긴 xml를 넘겨서 인증하는 방식) 로그인 이 중 폼 로그인 , 혹은 ..

반응형