티스토리 뷰
스프링 문서를 참고하여 정리하였습니다.
Authentication :: Spring Security
Spring Security provides comprehensive support for Authentication. We start by discussing the overall Servlet Authentication Architecture. As you might expect, this section is more abstract describing the architecture without much discussion on how it appl
docs.spring.io
Spring Security는 Authentication에 대한 지원을 제공한다.
이 포스팅은 전체적인 서블릿 인증 아키텍처가 어떻게 구체적인 흐름에 적용되는지에 대한 많은 논의 없이 아키텍처를 설명하는 더 추상적이다.
원하는 경우 사용자가 인증할 수 있는 구체적인 방법은 다음 내용에서 다룬다.
Username/Password Authentication
사용자를 인증하는 가장 일반적인 방법 중 하나는 사용자 이름과 암호를 확인하는 것이다.
이와 같이 Spring Security는 사용자 이름과 비밀번호로 인증할 수 있는 포괄적인 지원을 제공한다.
Reading the Username & Password
Spring Security는 HttpServletRequest에서 사용자 이름과 암호를 읽기 위한 다음과 같은 내장 메커니즘을 제공한다.
1.1. Form Login
Spring Security는 html Form을 통해 제공되는 사용자 이름과 암호를 지원한다.
Spring Security 내에서 Form 기반 인증이 작동하는 방식에 대해 자세히 알아보자.
다음 그림은 사용자가 로그인 Form으로 리디렉션되는 방법을 확인한다.
- 먼저, 사용자는 인증되지 않은 리소스 /private를 호출한다.
- Spring Security의 FilterSecurityInterceptor는 AccessDeniedException을 던져 인증되지 않은 요청이 거부되었음을 나타낸다.
- 사용자가 인증되지 않았으므로 ExceptionTranslationFilter는 저번 포스팅에서 알아본 Start Authentication 절차를 밟고 구성된 AuthenticationEntryPoint를 사용하여 로그인 페이지로 리디렉션한다.
- 그러면 브라우저가 리디렉션된 로그인 페이지를 요청한다.
- 애플리케이션 내의 무언가가 로그인 페이지를 렌더링해야 한다.
username과 password를 넘기면 UsernamePasswordAuthenticationFilter는 username과 password를 인증한다.
UsernamePasswordAuthenticationFilter가 아래 그림과 비슷하게 AbstractAuthenticationProcessingFilter로 확장된다.
위 그림은 SecurityFilterChain 다이어그램을 기반으로 한다.
- username과 password를 넘기면 UsernamePasswordAuthenticationFilter가 UsernamePasswordAuthenticationToken을 생성한다.
- 이 토큰은 HttpServletRequest에서 username 및 password를 추출하여 인증하는 역할을 수행한다.
- UsernamePasswordAuthenticationToken이 인증될 AuthenticationManager로 전달된다.
- AuthenticationManager의 모양에 대한 세부 정보는 사용자 정보가 저장되는 방식에 따라 달라진다.
- 실패 flow
- RememberMeServices.loginFail이 호출된다. (구성되어 있지 않다면, 호출되지 않는다.)
- AuthenticationFailureHandler가 호출된다.
- 성공 flow
- SessionAuthenticationStrategy에 새 로그인이 통보된다.
- 인증은 SecurityContextHolder에서 설정된다.
- RememberMeServices.loginFail이 호출된다. (구성되어 있지 않다면, 호출되지 않는다.)
- ApplicationEventPublisher가 InteractiveAuthenticationSuccessEvent를 publish한다.
- AuthenticationSuccessHandler가 호출된다.
- 로그인 페이지로 리디렉션할 때 ExceptionTranslationFilter에 의해 저장된 요청으로 리디렉션되는 SuccessHandler이다.
Spring Security 양식 로그인은 기본적으로 활성화되어 있다.
그러나 서블릿 기반 구성이 제공되는 form 기반 로그인을 다음 코드처럼 명시적으로 제공해야 한다.
fun filterChain(http: HttpSecurity): SecurityFilterChain {
http {
formLogin { }
}
// ...
}
위 코드에서 Spring Security는 기본 로그인 페이지를 렌더링한다.
대부분의 프로덕션 응용 프로그램에는 커스텀 로그인 양식이 필요하다.
아래 코드는 커스텀 로그인 양식을 제공하는 방법을 보여준다.
fun filterChain(http: HttpSecurity): SecurityFilterChain {
http {
formLogin {
loginPage = "/login"
permitAll()
}
}
// ...
}
Spring Security 구성에서 로그인 페이지가 지정된 경우 페이지를 렌더링해야 한다.
아래는 /login의 로그인 페이지를 준수하는 HTML 로그인 양식을 생성하는 Thymeleaf 템플릿이다.
Please Log In
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
<head>
<title>Please Log In</title>
</head>
<body>
<h1>Please Log In</h1>
<div th:if="${param.error}">
Invalid username and password.</div>
<div th:if="${param.logout}">
You have been logged out.</div>
<form th:action="@{/login}" method="post">
<div>
<input type="text" name="username" placeholder="Username"/>
</div>
<div>
<input type="password" name="password" placeholder="Password"/>
</div>
<input type="submit" value="Log in" />
</form>
</body>
</html>
- form에서 /login을 수행해야 한다.
- 이 양식에는 Tymeleaf에 의해 자동으로 포함된 CSRF 토큰이 포함되어야 한다.
- username이라는 매개 변수에 로그인 아이디를 지정해야 한다.
- form에서 password라는 이름의 매개 변수에 암호를 지정해야 한다.
- HTTP 매개 변수 오류가 발견되면 사용자가 올바른 username/password를 제공하지 못했음을 나타낸다.
- HTTP 매개 변수 로그아웃이 발견되면 사용자가 성공적으로 로그아웃했음을 나타낸다.
Spring MVC를 사용하는 경우 GET /login을 우리가 만든 로그인 템플릿에 매핑하는 컨트롤러가 필요하다.
Login Controller의 최소 샘플은 다음과 같다.
@Controller
class LoginController {
@GetMapping("/login")
fun login(): String {
return "login"
}
}
'Sping Framework > Spring Security' 카테고리의 다른 글
스프링 시큐리티 [4]. Servlet Authentication Architecture (0) | 2022.08.20 |
---|---|
스프링 시큐리티 [2]. Architecture (0) | 2022.08.02 |
스프링 시큐리티 [1]. 자동 설정과 기능 프리뷰 (0) | 2022.07.31 |
- Total
- Today
- Yesterday
- C++
- 백준
- Kotlin
- BAEKJOON
- 디자인 패턴
- programmers
- 테라폼
- 객체지향
- Effective Java
- JPA
- 클린 코드
- node.js
- 이팩티브 자바
- Spring Boot
- BOJ
- Java
- AWS
- 클린 아키텍처
- MSA
- kkoon9
- 정규표현식
- Olympiad
- 코테
- 알고리즘
- Algorithm
- 프로그래머스
- kotest
- Spring
- 디자인패턴
- 이펙티브 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |