일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- CPU
- 프로그래머스
- 쿠키
- 자바의정석
- 바탕화면 정리 자바
- java
- 자바의 정석
- userdetailsservice 설정
- 멀티태스킹
- 다형성
- 달리기 경주 자바
- 개인정보 수집 유효기간 자바
- 로그인 핸들러 구현
- spring security 설정
- 티스토리챌린지
- 입출력
- 객체지향
- SQL Mapper
- 리눅스
- 오블완
- 오버라이딩
- 캡슐화
- 오버로딩
- spring security
- hackerrank
- 혼공얄코
- 공원 산책 자바
- authenticationprovider 설정
- 멀티프로세싱
- over()
- Today
- Total
쉽게 쉽게
[Spring] Spring Security 구현 (1) - 설정 본문
▤ 목차
1. Spring Security 설정 방법
Spring Security 설정에 2가지 방법을 사용할 수 있다는 것을 알았다.
java config 방식과 xml 방식인데 이 둘은 설정방법에는 차이가 있다.
이 둘의 차이를 먼저 알아보고 프로젝트에 적용하고자 했다.
1. Java Config 방식
장점
- 타입 안전성: Java Config 방식은 컴파일 시점에 오류를 검출할 수 있기 때문에 타입 안전성을 보장한다. 설정 중 잘못된 구문을 작성하면 컴파일 시점에 바로 경고를 받을 수 있다.
- IDE 지원: Java 코드 기반 설정은 IDE에서 코드 자동 완성 및 리팩토링에 대한 지원이 잘 제공된다.
- 유연성: Java Config 방식은 조건부 로직을 넣거나 복잡한 설정을 처리하는 데 유연하다. Java 코드의 장점을 활용하여 특정 설정에 대해 조건문이나 반복문을 사용할 수 있다.
- 현대적 접근 방식: Spring Boot를 포함한 최신 Spring 프로젝트에서는 Java Config 방식을 더 권장하고 있으며, Spring 5+부터는 Java Config가 기본 설정 방식으로 자리 잡고 있다. XML보다 더 직관적이고 유지보수성이 높다고 평가된다.
- 간소화: XML 기반 설정과 달리, 많은 설정을 하나의 클래스에서 관리할 수 있어 파일 관리가 간소화되고, 클래스 내부에서 필요한 설정을 유연하게 다룰 수 있다.
단점
- XML 설정 방식에 익숙한 개발자나 팀이라면 Java Config 방식으로 전환할 때 약간의 학습 곡선이 있을 수 있다.
- 설정 코드가 혼합됨: 비즈니스 로직과 설정 코드가 동일한 프로젝트에서 공존하기 때문에 코드의 가독성이 떨어질 수 있다. 설정과 비즈니스 로직을 분리하고 싶은 경우에는 설정 파일이 따로 있는 XML 방식이 더 명확할 수 있다.
2. XML 설정 방식
장점
- 설정과 로직의 명확한 분리: XML 파일을 통해 설정을 관리하기 때문에 비즈니스 로직과 설정이 명확하게 분리된다. 특히 대규모 프로젝트에서 설정 관리가 용이할 수 있습니다.
- 레거시 시스템과의 호환성: 기존의 Spring XML 설정 방식에 익숙한 팀에서는 새로운 기술을 도입하지 않고도 설정을 쉽게 유지할 수 있다. 또한, XML 설정을 사용 중인 레거시 프로젝트에서는 유지보수 시 XML 설정을 계속 사용할 수 있다.
- 프로젝트 초기 설정이 용이: 여러 설정 파일을 XML로 관리하면 프로젝트 초기 설정이나 환경 변경 시 XML 파일만 수정하면 되기 때문에 프로젝트 구조를 쉽게 파악할 수 있다.
- 외부 설정 관리 용이: 설정 파일이 외부에 존재하기 때문에 환경별로 설정을 쉽게 관리할 수 있다.
단점
- 유지보수 복잡성: XML 설정 파일이 많아지면 설정 파일을 관리하기 어려워질 수 있다.
- IDE 지원 부족: Java Config 방식에 비해 IDE의 자동 완성이나 타입 검사를 통한 오류 검출 기능이 부족하다. XML 파일에서 설정 오류를 찾는 것이 더 어렵고, 런타임 시에야 오류를 발견할 수 있다.
- 유연성 부족: XML은 고정된 구문으로만 설정할 수 있어, 복잡한 설정이나 동적으로 설정을 변경하는 데 Java 코드만큼 유연하지 않다. 조건부 로직을 적용하는 것이 어렵고, 추가적인 작업이 필요할 수 있다.
- 점차 감소하는 사용: 최신 Spring 버전에서는 Java Config 방식이 기본이기 때문에 XML 설정 방식은 점차 덜 사용되고 있다.
결론
Java Config 방식은 최신 Spring 프로젝트에서 선호되며, 타입 안전성, 유연성, IDE 지원 측면에서 이점이 많다.
XML 설정 방식은 설정과 로직의 분리가 명확하고, 기존에 XML 설정에 익숙한 레거시 프로젝트에서는 유용하다. 하지만 유지보수성과 유연성 측면에서 Java Config 방식보다 불리할 수 있다.
2. Spring Security 구현
필자는 레거시 프로젝트와 호환성을 유지해야 했기때문에 XML 방식으로 구현했다.
전체적인 구현 과정은 아래와 같다.
Spring Security 라이브러리 추가 -> Spring Filter 추가 -> Spring_security 설정 파일 추가 -> 커스텀 설정 추가
1. pom.xml에 추가
<properties>
<!-- spring-security-->
<spring.security-version>5.8.1</spring.security-version>
</properties>
<!-- security -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security-version}</version>
</dependency>
2. web.xml에 Spring Filter 추가
<!-- Security 기능 제공 -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Security 기능 제공 -->
이후 설정할 context-security.xml을 읽어올 수 있도록 하기 위해서 아래처럼 경로를 추가하면 된다.
context-security.xml은 src/main/resources -> config 파일에 위치할 것이다. (경로는 사용자 경로에 따라 맞춰주면 된다.)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/context-*.xml</param-value>
</context-param>
3. Spring_security 설정 파일 추가(context-security.xml)
커스텀 전에 임시 테스트를 위한 설정을 작성한 것이다.
추후에 커스텀 설정을 추가할 것
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/security
https://www.springframework.org/schema/security/spring-security-5.8.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- HTTP 보안 설정 -->
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/resources/**" access="permitAll" />
<intercept-url pattern="/**" access="ROLE_USER" />
<!-- 로그인 설정 -->
<!-- 테스트를 위해 form-login 주석처리 -->
<!-- <form-login
login-page="/common/login.do"
default-target-url="/common/main.do"
login-processing-url="/common/loginProcess.do"
authentication-failure-url="/common/login.do?error=true"
username-parameter="user_id"
password-parameter="user_password" />
로그아웃 설정
<logout logout-url="/common/logout" logout-success-url="/common/login.do" invalidate-session="true" delete-cookies="JSESSIONID"/>
-->
</http>
<!-- PasswordEncoder 설정 (Spring Security 5.8.1 권장사항) -->
<beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<!-- In-Memory 사용자 정보 설정 -->
<!-- 말 그대로 메모리에 사용자가 저장되어 프로그램이 종료되면 사용자는 없어집니다.
주로 테스트 목적으로 사용하기 적합합니다. -->
<authentication-manager>
<authentication-provider>
<password-encoder ref="passwordEncoder"/>
<user-service>
<user name="user"
password="{noop}password"
authorities="ROLE_USER" />
<user name="admin"
password="{noop}password"
authorities="ROLE_ADMIN" />
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
4. Spring Security 설정 정리
auto-config 설정
- 로그인 페이지와 로그아웃 기능을 기본 설정으로 생성
- 기본 권한 체크와 HTTP 세션 보안 적용
- 즉 Spring Security에서 제공하는 인증 기능을 사용한다는 뜻
위의 화면처럼 Spring Security에서 제공하는 기본 로그인 페이지, 경로, 보안 등을 제공한다.
단 커스텀을 위해서라면 auto-config 설정을 false로 지정해야 한다. (테스트 용으로만 사용할 것)
use-expressions 설정
- Spring Security의 SpEL 표현식을 사용해 권한 제어를 더욱 유연하게 할 수 있도록 해준다.
- false일 경우 access 속성에서 단순히 hasRole('ROLE_USER')와 같은 권한 체크만 가능
- true일 경우 isAuthenticated(), isAnonymous() 등 좀 더 자세한 권한 체크 가능
pattern 설정
- 접근 제한을 설정할 URL 패턴을 지정
access 설정
- 접근 권한을 지정
- hasRole : access 속성에 지정된 권한을 가진 사용자만 접근
- hasAnyRole : access 속성에 지정된 권한 중 하나를 가진 사용자만 접근
- permitAll : 모든 사용자의 접근을 허용
- denyAll : 모든 사용자의 접근을 거부
form-login (로그인 세부 설정) -- 테스트를 위해 임시 주석
- Spring Security의 로그인 인증을 하는 역할
- login-processing-url : 로그인 요청을 처리할 URL을 지정. 기본값은 /login
- username-parameter : 로그인 폼에서 사용자 ID를 입력받을 input 태그의 name 속성 값을 지정. 기본값은 username
- password-parameter : 로그인 폼에서 비밀번호를 받을 input 태그의 name 속성 값을 지정. 기본값은 password
- default-target-url : 로그인이 성공하면 이동할 URL을 지정
- authentication-success-handler-ref : 로그인이 성공하면 호출될 핸들러를 지정
- authentication-failure-handler-ref : 로그인이 실패하면 호출될 핸들러를 지정
- logout : 로그아웃 요청을 처리할 URL을 지정
PasswordEncoder 설정 (Spring Security 5.8.1 권장사항)
- PasswordEncoder는 비밀번호를 해시된 형태로 저장하여 보안을 강화하며, 사용자가 로그인할 때 입력한 비밀번호와 저장된 비밀번호 해시를 비교하여 인증을 수행
- Spring Security 5버전 이상에서 필수로 구현해야 한다.
authentication-manager 설정
- authentication-manager는 인증 처리하는 filter로부터 인증처리를 지시받는 첫 번째 클래스
- Spring Security는 ID와 Password를 Authentication 인증 객체에 저장하고 이 객체를 AuthenticationManager에게 전달
- authentication-manager는 AuthenticationProvider 목록 중에서 인증 처리 요건에 맞는 AuthenticationProvider를 찾아 인증 처리를 위임
In-Memory 사용자 정보 설정
- In-Memory 사용자 정보 설정 : 일회성 사용자를 설정하여 사용. 주로 테스트 목적으로 사용하기 적합.
- PasswordEncoder를 설정해야 하지만 {noop}을 통해 임시적으로 암호화를 안하도록 설정할 수 있다.
- 커스텀하기 전 테스트용으로 설정했다.
- 현재 모든 경로가 ROLE_USER에만 허용되어 있기 때문에 user / password / ROLE_USER를 접속하면 모든 경로에 접속가능하며 admin / password / ROLE_ADMIN로 로그인하면 접속이 거부될 것이다.
이렇게 임시 테스트를 위한 Spring Security 설정을 끝냈다.
이후에는 커스텀을 통해 pattern 경로, form-login, authentication-manager 등의 설정을 변경해서 적용할 것이다.
만약 로그인이 안된다하면 csrf 토큰에 대해 비활성화 설정을 추가하고 진행해보길 바란다.
<!-- csrf 비활성화 -->
<csrf disabled="true" />
https://velog.io/@cyseok123/Spring-Security
잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다. |
'개발공부 > Spring' 카테고리의 다른 글
[Spring] Spring Security 구현 (2) - 커스텀 (1) | 2024.11.05 |
---|---|
[Spring] tiles 적용 (5) | 2024.09.05 |
[Spring] static 변수에 autowired 설정 방법 (0) | 2024.07.29 |
[Spring] 스케줄러 구현 (1) | 2024.06.30 |
[Spring] 게시글 조회수 중복방지 (1) | 2024.05.30 |