2일차, 스프링 시큐리티 1
스프링 시큐리티 시작 하기
스프링 시큐리티는 spring boot 버전과, Spring Security 버전이 서로 호환이 되어야 한다.
그리고 Spring Security 버전에 따라 내용도 조금씩 다르므로 버전마다 릴리지 내용도 확인해볼필요가 있다.
개발환경
- Spring Boot 3.4.1
- Spring Security 6.1.2
다음 주소는 spring project 를 하기위한 initializr 사이트 주소이다.
다음과 같이 따라하면 된다.
Project Language 는 java 선택하고
Spring Boot 는 3.4.1
Project Metadata 정보의미를 설명하자면
(1) Project : 빌드 툴을 선택합니다.
(2) Language : 프로젝트에 사용하고자 하는 프로그래밍 언어를 선택합니다.
(3) Spring Boot : 스프링 부트의 버전을 선택합니다. 버전 이름 뒤에 아무 것도 붙지 않은 버전 중, 가장 최신 버전을 선택합니다.
- SNAPSHOT : 아직 개발이 완료되지 않은 버전을 의미합니다.
- M(Milestone) : 개발은 완료되었으나, 아직 기능들을 개선하는 중 또는 버그를 수정하고 있는 버전을 의미합니다.
- RC(Release Candidate) : 기능 개선과 버그 수정이 완료되었으나, 최종적으로 릴리즈되지는 않은 버전을 의미합니다.
(4) Project Metadata : 프로젝트의 정보를 입력합니다.
- Group : 프로젝트를 만드는 그룹의 이름으로, 보통 기업의 도메인 명을 역순으로 입력합니다. 여기에서는 com.example 로 입력하겠습니다.
- Artifact : 빌드 결과물의 이름입니다.
- Name : 프로젝트의 이름입니다. download 받을때 파일명입니다.
- Description : 프로젝트에 대한 간략한 설명을 입력합니다.
- Package name : 프로젝트에 생성할 패키지를 설정합니다.
- Packaging : 배포를 위해 프로젝트를 압축하는 방법을 선택합니다.
- Java : 여러분의 PC에 설치된 JDK의 버전을 선택하면 됩니다.
(5) Dependencies : 프로젝트를 통해 만들 애플리케이션의 동작에 필요한 라이브러리들을 선택합니다.
- Spring Web만 추가해봅시다. Spring Web을 Dependencies에 추가하면 스프링 기반의 웹 애플리케이션을 개발하는 데에 필요한 라이브러리들이 자동으로 설정됩니다.
요약
Group ID
- 모든 프로젝트 중에서 해당 프로젝트를 식별하게 해주는 식별자
- Java의 패키지 이름 규칙을 따라야 함
- 도메인 명을 역순으로 표현
Artifact ID
- 해당 프로젝트의 이름을 사용
- 단, 소문자로만 작성
- 특수 문자 사용 X
Name
- 물리적으로 생성되는 프로그램(프로젝트)의 이름을 정한다.
- Artifact와 비슷하여 같은 이름을 쓰는 경우가 많다.
Group ID: 프로젝트의 큰 틀
Artifact ID: 프로젝트의 각 기능
springtoolsuite4 로 시작
스프링 InteliJ 로 시작
maven 리플레시 이후 run
패키지생성
com.example.springsecurity.controller
IndexController 생성
package com.example.springsecurity.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController {
@GetMapping({ "", "/" })
public @ResponseBody String index() {
return "main.mustache";
}
}
main.mustache
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Main Page</title>
</head>
<body>
main page
</body>
</html>
pom.xml 시큐리티를 의존성 삭제후 재시작..
의존성 주석처리하면 main.mustache 페이지로 접근된다.
의존성 시큐리티 추가후 재시작 비교.(login) 페이지로 자동이동됨
기본아이디 : user
패스워드:
인증이 되면 main 페이지로 이동이 된다.
작동원리
동작원리
- 사용자가 Form을 통해 로그인 정보를 입력하고 인증 요청을 보낸다.
- AuthenticationFilter(사용할 구현체 UsernamePasswordAuthenticationFilter)가 HttpServletRequest에서 사용자가 보낸 아이디와 패스워드를 인터셉트한다.
프론트 단에서 유효성검사를 할 수도 있지만, 안전을 위해서 다시 한번 사용자가 보낸 아이디와 패스워드의 유효성 검사를 한다.
HttpServletRequest에서 꺼내온 사용자 아이디와 패스워드를 진짜 인증을 담당할 AuthenticationManager 인터페이스(구현체 - ProviderManager)에게 인증용 객체(UsernamePasswordAuthenticationToken)로 만들어줘서 위임한다. - AuthenticationFilter에게 인증용 객체(UsernamePasswordAuthenticationToken)을 전달받는다.
- 실제 인증을 할 AuthenticationProvider에게 Authentication객체를 다시 전달한다.
- DB에서 사용자 인증 정보를 가져올 UserDetailsService 객체에게 사용자 아이디를 넘겨주고 DB에서 인증에 사용할 사용자 정보(사용자 아이디, 암호화된 패스워드, 권한 등)를 UserDetails(인증용 객체와 도메인 객체를 분리하지 않기 위해서 실제 사용되는 도메인 객체에 UserDetails를 상속하기도 한다.)라는 객체로 전달 받는다.
- AuthenticationProvider는 UserDetails 객체를 전달 받은 이후 실제 사용자의 입력정보와 UserDetails 객체를 가지고 인증을 시도한다.
- 인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담은 이후 AuthenticationSuccessHandle를 실행한다. (실패시 AuthenticationFailureHandler를 실행)
https://github.com/WhiteFoxZ/springsecurity.git
GitHub - WhiteFoxZ/springsecurity: Spring Security 6.1.2
Spring Security 6.1.2. Contribute to WhiteFoxZ/springsecurity development by creating an account on GitHub.
github.com