728x90
반응형
스프링 시큐리티란
- 인증/인가와 보안 기능을 담당하는 라이브러리
- 쉽게 풀이하면 로그인, 권한설정, 권한검사 기능 등을 제공
- 원리 : 서블릿 필터를 이용
사용자가 리퀘스트를 주면 스프링 엠브시에서 리스폰스를 줌
즉 사용자가 리퀘스트를 서블릿 컨네이너에 주고 서블릿 컨네이너 즉 톰켓과 같은 것이 리스폰스해준다.
다시 서블릿 컨네이너에서 스프링 DispatcherServlet 에 요청하면 컨네이터네 리스폰스 해준다.
서블릿 컨네이너에서 리스폰스 리퀘스트간 스프링 디스패치 사이에 필터로 시큐리티를 구현
바로 필터를 구현하면 스프링 빈을 인식하지 못하므로, 스프링에게 구현을 위임한다.
스프링 시큐리티 bean은 필터들로 구성되어 있고, 이 필터들의 모음을 securityfilterchain이라고 부른다.
필터는 각각 고유한 역할을 담당하며 default로 등록되는 필터는 존재한다.
예) AbstractAuthenticationProcessiongFilter는 인증을 담당
자동으로 비밀번호가 생성되는것을 확인할 수 있으며 새로 시작하는 경우 비밀번호는 계속 변동된다.
회원가입/로그인 구현
구현방법은 다양하나 핵심은 스프링시큐리티 인터페이스를 사용
- 스프링시큐리티 흐름을 이해하고 인터페이스를 사용
- 모든 흐름을 커스터마이징할 것인다, 일부 흐름만 커스터마이징할 것인가는 개발자 선택
프로젝트 생성
- /login, /logout API가 자동으로 생성
- 로그인 : /login(post)
계정 : user, 비밀번호 : 프로젝트 실행 후 확인한 비밀번호
- 로그아웃 : /logout(post) 기존 패스워드는 계속 다르다.
인증필터 디버깅
- 로그인을 요청하면 breakpoint에 멈췄으므로 usernamepasswordauthenticationfilter가
로그인(인증)을 담당하는 것을 확인할 수 있다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/")
public String helloworld() {
return "hello world";
}
스프링 시큐리티를 사용하면 따로 html 파일을 만들지 않아도 위와 같은 화면이 나온다.
로그인하면 나오는 화면
세션 - 서블릿 컨네이너 자체가 세션을 발급을(ID에) 해준다.
- 로그인 여부 등 HTTP 통신에 필요한 데이터를 서버 메모리에 저장하는 방법
* 서버가 재부팅되면 기존에 저장된 데이터는 사라진다.
- springsecurity는 기본으로 세션으로 로그인 여부를 관리
예) default설정 : 세션이 없으면 로그인이 안되었다는 것으로 간주하여 로그인페이지로 리다이렉트
- 로그인이 성공하면 새로운 세션 발급
스프링 시큐리티 단점 - 동시 로그인이 가능하다. 세션 하이제킹
백엔드 프론트 연동
- 프론트는 백엔드 API호출할 때 세션을 같이 넘겨야 한다.
- 스프링시큐리티는 프론트가 전송한 세션을 사용해서 인증을 검사한다.
- 백앤드 개발자는 세션인증 로직을 개발하지 않아도 된다.
frontend -> jessionid -> backend
로그인된 유저 조회
- 스프링시큐리티는 spring mvc에서 로그인된 유저를 가져올 수 있도록 어노테이션 제공
@AuthenticationPrincipal : 로그인 객체를 받아오고 유저 정보를 얻을 수 있다.
✔ 컨트롤러 부분
@GetMapping("/session")
public ResponseCookieDto hello(@AuthenticationPrincipal User user, HttpSession HttpSession) {
String username = "empty";
String session_id = "empty";
if (user == null) {
System.out.println("user is empty");
}else{
session_id = HttpSession.getId();
username = user.getUsername();
}
return new ResponseCookieDto(username, session_id);
}
✔ DTO 부분
package com.demo.springSecurity.controller;
public class ResponseCookieDto {
public String username;
public String session_id;
public ResponseCookieDto(String username, String session_id){
this.username= username;
this.session_id= session_id;
}
}
반응형
'Spring' 카테고리의 다른 글
Spring Boot 비동기 처리(@Async)로 성능 향상 원리와 동기/비동기 (0) | 2025.02.19 |
---|---|
Spring 시험 (7번), Thymleaf 이용 리스트 출력 (1) | 2023.01.09 |
Spring Project Board 2 (Repository, DTO, PageController) - 타임리프 SQL 출력 (1) | 2023.01.08 |
Spring Project Board(게시판) 1 (0) | 2023.01.02 |
Spring 유용한 Setting, 사이트 (0) | 2022.12.29 |