build.gradle에 다음과 같은 dependencies 추가.
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'
이제 프로젝트를 Run 하고, localhost:8080에 접속하면, 다음과 같은 화면 표시됨.
스프링 시큐리티는 인증되지 않은 사용자는 서비스를 사용할 수 없게끔 되어있다. 그러나 이 상태로는 서비스를 운영하기 어렵기 때문에, 시큐리티 설정을 바꾸어 주어야 한다.
ex) 로그인을 하지 않아도 게시물 조회, 검색 등을 할 수 있도록.
src/main/java/com.프로젝트명/SecurityConfig.java 를 생성해준다.
SecurityConfig.java
- @Configuration은 환경설정을 의미하는 어노테이션이다.
- @EnableWebSecurity는 모든 요청 URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션이다.
- 클래스에서는 내부적으로 SpringSecurityFilterChain이 동작하여 URL 필터가 적용되게 한다.
- 일단 모든 인증되지 않은 요청을 허락하게 해주었다. 따라서 로그인을 하지 않더라도, 모든 페이지에 접근할 수 있다.
서버가 기동되면 스프링 시큐리티의 초기화 작업 및 보안 설정이 이루어진다.
별도의 설정이나 구현을 하지 않아도, 기본적인 웹 보안 기능이 현재 시스템에 연동된다.
개발 도중에 매번 성성되는 랜덤 문자열로 로그인 하는 것은 번거롭다.
application.properties에 기본 name/password 를 설정할 수 있다.
사용자 정의 보안기능 구현으로 보안성을 높일 수 있다.
SecurityConfig 설정 클래스를 생성하고 인증 & 인가 API를 만들어 보안성을 높인다.
1. 클라이언트가 홈페이지를 갔다가, 서버에서 인증이 안됐다고 판단하면, 로그인 페이지로 리다이렉트 시킨다.
2. 클라이언트는 로그인 페이지에서 로그인을 하면, 서버에서는 DB의 내용과 비교하여 맞으면 SESSION 및 인증 토큰을 생성, 저장한다.
3. 이제 클라이언트는 SESSION에 저장된 인증 토큰으로 접근하고, 인증을 유지한다.
클라이언트가 로그아웃을 서버에게 요청하면, 서버는 세션을 무효화 시키고, 인증 토큰을 삭제하고, 쿠키 정보를 삭제하고, 클라이언트를 로그인 페이지로 리다이렉트 시킨다.
상황
하나의 계정을 A라는 사람이 먼저 접속해 있는데, B라는 사람이 접속했을 경우.