
이전 글에서 스프링 시큐리티가 인증을 위해 어떤 설계로 구성, 동작하는지 전반적인 아키텍처를 살펴보았다. 객체간의 호출 관계를 텍스트로만 보면 약간 이해가 어려울 수 있는데 공식 도큐먼트에서 설명하고있는 예제를 통해 더 쉽게 이해할 수 있다. Form Login 폼 로그인의 아이디, 비밀번호를 폼에 입력해서 인증받을 수 있는 가장 일반적인 경우이다. 임의의 url로 접근했을 때 로그인 페이지로 리다이렉션되기까지... 1. 클라이언트의 /private 요청 클라이언트가 /private라는 api를 요청했다. 여기서 중요한점은 클라이언트는 인증과정에서 익명으로 판단된 것이다. 2. 접근 거부, AccessDeniedException 익명 클라이언트의 /private 요청은 SecurityFilterChain..

Spring Security - Architectrue에서 설명했던 아키텍쳐는 서블릿에서 스프링 시큐리티가 어떻게 Servlet 구조에서 인증, 인가를 하기위해 어떻게 동작하는지 살펴보았다. 클라이언트 요청이 일련의 필터체인을 거치면서 각 체인에 필요한 단계들을 거치는데 이러한 단계 뿐만 아니라 실제 애플리케이션 로직에서 사용할 공통적인 정보들을 공유하기 위해 ThreadLocal에 일련의 정보들을 보관하고 관리하는데 SecurityContextHolder이다. 위 그림의 SecurityContextHolder를 보면 여러 내부 하위 정보를 감싸는 형태로 구성되어 있는데, 실제 인증, 권한 정보를 저장하는 Principal, Credentials, Authorities 객체를 Authentication이..

보안(Security)에는 크게 두가지 개념, 인증(authentication)과 인가(authorization) 부분으로 나뉜다. 인증은 이 사용자가 현재 사용자가 누구인지 확인하는 과정이며 인가는 이 사용자가 특정 리소스를 사용할 자격이 있는지에 대한 부분이다. 예를들어 로그인을 한다는 행위는 사용자가 누구인지 특정할 수 있는 인증에 해당하고, 로그인 한 사용자가 일반 사용자인지, 관리자인지에 따라 관리자 페이지를 보여줄지 등을 결정하는 과정이 인가 과정이다. 스프링 시큐리티는 애플리케이션에 대한 인증, 인가를 지원하기 위해 여러개의 필터들로 구성된 필터 체인과 연관된 여러 모듈로 구성되어 있다. 이러한 필터들을 개발자가 직접 생성 또는 수정할 수 있도록 되어있다. 오염된 물을 정수하기 위해서 여러개..
slf4j에서 로그를 쓸 때 아래와 같은 포맷이 매우 편해서 어떤 모듈을 사용하는지 궁금해서 라이브러리를 오픈해보았다. log.error("find by id = {}", id); 지금 프로젝트는 log4j 구현체를 사용하고 있었는데 org.apache.logging.log4j.message.ParameterizedMessage라는 구현체를 사용하고 있었다. Exception 메세지 +로 파라미터들을 메세지와 조합하는게 번거롭고 String.format을 사용하기엔 타입도 고려해줘야되고 귀찮은 점이 많았는데 이 구현체를 사용해서 아래 처럼 활용할 수 있을 것 같다. import org.apache.logging.log4j.message.ParameterizedMessage; public Class Cut..

Servlet Servlet(서블릿)이란 자바 클래스 종류 중 하나로 요청-응답 프로그래밍 모델을 제공하는 서버(일반적인 경우 web)의 기능을 구현, 확장하기 위한 클래스이다. javax.servlet, javax.servlet.http 패키지에 서블릿 구현을 위한 인터페이스와 클래스들이 있다. 모든 서블릿 구현체들은 서블릿 라이프사이클을 정의한 Servlet 인터페이스를 구현해야 하며 일반적인 서비스를 구현할 경우 GenericServlet를 사용/상속해서 구현할 수 있다. HttpServlet의 경우 HTTP 서비스를 핸들링하기 위한 doGet, doPost 메소드를 제공하고 있다. Servlet.java 총 5개 실제 서블릿 코드를 보면 총 5개의 미구현 메소드가 있다. 이 메소드들은 서블릿의 라..

프로세스, Process 실행 가능한 하나의 프로그램이 OS(Operation System)로부터 고유한 시스템 리소스 영역을 할당받아 실행 가능한 형태로 해당 영역에 적재(특히 메모리)되는 하나의 인스턴스이다. 일반적으로 프로그램을 하나 실행하면 그 프로그램이 OS가 할당한 시스템 리소스 영역에 적재되어 하나 이상의 프로세스가 실행된다. 즉 프로세스는 현재 실행 중인 프로그램의 하나의 형태이라고 할 수 있다. 여기서 OS로 부터 할당받는 다는 것은 OS의 스케쥴러에 의해 영향을 받는다는 의미이다. 예를들어 필요에 따라 OS 스케쥴러가 특정 프로세스의 리소스를 멈추게하는 등의 행위를 할 수 있다. 고유한 시스템 리소스 영역을 할당받기 때문에 다른 프로세스가 할당받은 영역에 접근할 수 없다. 이러한 이유로..