굉장히 흥미로운 필터이다. 기능으로 설명해보자면 우리가 로그인을 할때 로그인유지하기 라는 칸을 본적이 있을것이다. 여기서 사용하는 능력이라고 볼수 있다. 그리고 우리가 어떤 페이지를 들어갈때 오늘 하루 해당 광고 보지 않기 라는 말을 본적이 있을것이다. 그것또한 이것과 비슷하다 세션이 만료되고 웹 브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는 기능이다. Remember-Me 쿠키에 대한 Http 요청을 확인한 후 토큰 기반 인증을 사용하여 유효성을 검사하고 토큰이 검증되면 사용자는 로그인 된다. 사용자의 라이프 사이클 인증 성공(Remember-Me 쿠키 설정) 인증 실패(쿠키가 존재한다면 쿠키 무효화) 로그 아웃(쿠키가 존재한다면 쿠키 무효화) 코드를 작성하는 요령은 이러하다. remembe..
두가지의 순서는 생각보다 많은 차이가 있다. 하지만 서로 굉장히 밀접한 관계가 있기 때문에 동시에 설명하려고 한다. CuncurrentSessionFilter 매 요청마다 현재 사용자의 세션 만료 여부 체크 세션이 만료되었을 경우 즉시 만료 처리 이러한 행위를 담당하는것이 CuncurrentSessionFilter 이다. 해당 세션이 만료가 되었는지 확인하고 만료가 되었다면 오류페이지를 응답시킴으로써 필터를 통과하지 못한다. 간단한 필터이기 때문에 이해는 어렵지 않지만 중요한것은 SessionManagementFilter와 연관이 되어있다는것이다. 어떻게 연관이 되어있는걸까 SessionManagementFilter 가 하는 과정에서 중요한 작업이 있다. 이글을 그냥 보고있는 독자는 SessionMana..
시큐리티에서의 세션은 굉장히 중요한 역할을 한다. 클라이언트와의 연결 관계에서도 아주 큰 역할을 하고 우리 서비스의 사용자와의 얘기에도 엄청나게 큰 역할을 한다. 그렇다면 세션이라는것은 시큐리티에서 가장 신경을 많이 쓰고 까다롭게 생성하고 사용되어야 한다는 말이다. 그렇다면 시큐리티의 세션을 담당하는 필터는 무엇이며 해당 필터는 어떤 일을 하는지 알아보자 SessionManagementFilter 세션 관리 당연하게도 인증시 사용자의 세션 정보를 등록하고 조회, 삭제등의 다양한 세션의 이력을 관리한다. 동시적 세션 제어 동일 계정으로 접속이 허용되는 최대 세션수를 제한한다 세션 고정 보호 인증 할 때마다 세션 쿠키를 새로 발급하여 공격자의 쿠키 조작을 방지한다 세션 생성 정책 Always, If_Requ..
시큐리티는 로그아웃을 했을때 적용하는 필터도 있다. 해당 필터의 내용은 간단하다. 너무 간단하니 말로 설명해보자면 클라이언트는 로그아웃이라는 요청을 보낸다. 그럼 서버에서는 해당 요청을 처리하게 되고 서버는 로그아웃에 대한 처리를 한다 대표적으로는 세션 무효화, 인증 토큰 삭제, 쿠키 정보 삭제를 시키고 로그인 페이지를 리다이렉트로 넘기기도 한다. 여기서 인증 토큰을 삭제 한다는 것은 우리가 SecurityContext 에 넣어놓았던 인증 객체를 말한다. 그럼 진행 순서를 한번 알아보자 사용자가 로그아웃 요청을 하면 LogoutFilter 에서 이 요청을 지나간다. 그럼 AntPathRequestMatcher가 해당 요청의 URL을 확인하고 맞다면 filter의 작업을 시작한다. 그럼 Context안에 ..
CSRF 공격 우선 CSRF 의 의미가 무엇인가 부터 알아보자 웹 어플리케이션의 취약점 중 하나로 인터넷 사용자가 자신의 의지롸는 무관하게 공격자가 의도한 행위를 특정 웹 사이트에 요청하게 만드는 공격인것이다. 세션을 이용해서 Security를 다룬다면 꼭 조심해야할 공격 기법이며 공격을 하는 과정은 다음과 같다 좀 더 설명을 해보자면 어느 한 선량한 사용자가 어떠한 쇼핑몰(서비스)에 접근하여 로그인을 했다. 그렇다면 스프링에서는 세션을 생성하여 쿠키로 발급한다. 그렇다면 사용자의 웹에는 세션이 쿠키에 저장이 되는데 사용자는 모든 요청에 쿠키값을 같이 동봉하여 보낸다. 여기서 문제가 생기는것이다. 공격자가 쇼핑몰에 있는 사용자의 정보를 가져오기 위해 즉, 공격을 위해 어떠한 태그를 만들어 사용자에게 보내..
SOLID 클린 코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리하였다. SRP : 단일 책임 원칙 (Single Responsibility Principle) 한 클래스는 하나의 책임만 가져야한다. 하나의 책임은 모호하다. 클수도 있고, 작을수도 있다 문맥과 상황에 따라 다르다. 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른것이다. OCP : 개방 - 폐쇄 원칙 (Open / Closed Principle) 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다. 말이 굉장히 이상하지만 다형성을 활용해본다면 알 수 있다. 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현한다. OCP의 문제점이 있다. 예를 들어 ..
Bean 이란? Bean이란 스프링 컨테이너에 등록한 객체들을 말한다. 그럼 스프링 컨테이너는 무엇인가? 스프링에서 객체를 생성할때 스프링 컨테이너에 생성하게 되는데 그렇게 들어간 객체들은 독립적이지 않고 상호작용하게 되는데 이를 "객체의 의존성"이라고 하고 그 객체들의 보관소 역할을 하는것이 컨테이너이다. 한번 더 말하자면 그 넓은 컨테이너 안에 들어가 있는 것(객체)들을"Bean"이라고 한다. Bean을 등록하는 두가지 방법 1. 컴포넌트 스캔과 자동 의존관계 설정 스프링 부트에서 사용자 클래스를 스프링 빈으로 등록하는 가장 쉬운 방법은 클래스 선언부 위에 @Component어노테이션을 사용하는 것이다. @Controller, @Service, @Repository는 모두 @Component를 포함라..
DI 각 클래스간의 의존관계를 빈 설정정보를 바탕으로 컨테이너가 자동으로 연결해주는것 Ex) Setter Injection, Constructor Injection, Field Injection 의존성을 주입하는 3가지 방법 spring은 @Autowired 어노테이션을 이용한 다양한 의존성 주입방법을 제공한다. @Autowired 어노테이션은 타입(클래스)로 Bean을 지정한다.(생성자, 필드, 메소드 모두 적용한다) 의존성 주입은 필요한 객체를 직접 생성하는것이 아닌 외부로부터 객체를 받아 사용하는것이다 이는 객체간의 결합도를 줄이고 코드의 재활용성을 높이는 방법이 된다 @Autowired는 Spring에게 의존성을 주입하는 지시자 역할로 쓰인다. 1. 생성자 주입(Constructor Injecti..
IoC(Inversion of Control) 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 뜻이다. IoC 컨테이너 ※컨테이너 - 보통 객체의 생명주기를 관리하고, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 한다. 스프링 프레임워크의 객체를 생성하고 관리하고 책임지고 의존성까지 관리해주는 컨테이너이다. 의존성이란? 객체 세계에서 협력은 필수이다. 객체가 서로 협력한다는 것은 객체간의 의존성이 존재한다라는 것이다. 파라미터나 리턴값 또는 지역변수 등으로 다른 객체를 참조하는 것 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신해줍니다. 그로 인해 객체관리 주체가 프레임워크(Container)가 되기 때문에 개발자가 로직에 집중할 수 있다. ..
말 그대로 Security에서 나올수 있는 예외 상황들이다. AuthenticationException(인증 예외) UsernameNotFoundException 계정없음 BadCredentialsException 자격증명 실패 아이디 혹은 비밀번호 불일치 비밀번호 불일치 AccountStatusException AccountExpiredException 계정만료 CredentialsExpiredException 비밀번호 만료 DisableException 계정 비활성화 LockedException 계정 잠김 말 그대로 적혀있는 오류들을 보고 확인하면 된다. BadCredentialsException같은 경우에는 아이디인지 비밀번호인지 정확히 알려주지 않는다. 그렇다면 AuthenticationProvi..