GIS Development

JWT 토큰 기반 로그인시 Spring Security 설정

무혼 2023. 12. 12.
728x90

https://dodop-blog.tistory.com/228

위 글을 참고하여 JWT 토큰 기반 로그인 기능을 구현했다. 동작 순서는 아래와 같았는데,

 

동작 순서

  1. JwtAuthenticationController.java:
    • 클라이언트에서 /authenticate URL로 사용자의 인증 정보를 제출
    • JwtRequestFilter에서 추출한 사용자의 정보를 받아서 실제 인증을 시도
    • 성공하면 JWT 토큰을 생성하고 클라이언트에게 반환
  2. JwtRequestFilter.java:
    • HTTP 요청에서 JWT 토큰을 추출하고, 추출한 토큰을 검증
    • 토큰이 유효하면, 해당 토큰을 사용하여 사용자를 인증하고, 보안 컨텍스트에 사용자 정보를 설정
  3. JwtUserDetailsService.java:
    • 데이터베이스에서 사용자 정보를 가져오는 역할
    • JwtRequestFilter에서 추출한 사용자 이름을 사용하여 데이터베이스에서 해당 사용자의 정보를 조회
  4. JwtUserDetails.java:
    • Spring Security의 UserDetails 인터페이스를 구현한 클래스, 실제 사용자의 정보를 나타냄
    • 사용자의 권한 등의 정보를 담고 있음
  5. JwtTokenUtil.java:
    • JWT 토큰을 생성하고, 토큰에서 정보를 읽어오는 등 JWT 관련 유틸리티 클래스
    • 토큰의 생성, 유효성 검증, 클레임에서 정보 추출 등의 기능 제공
  6. JwtAuthenticationEntryPoint.java:
    • Spring Security에서 인증이 실패했을 때 호출되는 커스텀 핸들러
    • 401 Unauthorized 응답을 클라이언트에게 반환
  7. WebSecurityConfig.java: (핵심)
    • Spring Security의 설정 클래스, 보안에 관련된 다양한 설정
    • JWT 관련 필터 및 커스텀 핸들러를 설정
  8. JwtRequest.java:
    • 클라이언트에서 전달되는 인증 정보를 담는 클래스

 

단순히 WebSecurityConfig.java 파일만 추가했더니, 컨트롤러의 url에 보안이 적용되지 않았다...

스프링 시큐리티가 제대로 설정이 되지 않은 것 같아, context-security.xml 파일web.xml에 코드를 추가하였다.

 

context-security.xml

<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/beans
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-4.2.xsd">
</beans:beans>

 

 

web.xml

<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>

 

적용 방법은 아래와 같다.

# WebSecurityConfig.java 클래스에서 configure(HttpSecurity http) 함수를 재정의
※ .antMatchers("url명").authenticated() : 해당 url은 토큰을 발급받은 사용자만 사용 가능
※ .antMatchers("url명").hasAuthority("USER") : 해당 url은 USER라는 권한을 부여받은 사용자만 사용 가능

# (USER 등...) 권한을 부여하는 법

1. 코드를 JwtUserDetailsService.java 파일의 loadUserByUsername 함수(필요에 따라 다른 함수)안에 넣어줌
- 코드 예시 :  (만약, DspUseYn 컬럼의 값이 Y인 경우 권한이 부여되는 경우라면)
if (entityUser != null && "Y".equals(entityUser.getDsp_use_yn())) {
             return new JwtUserDetails(entityUser);
          }
- JwtUserDetails.java 클래스의 getAuthorites() 함수에서 return값을 보면 USER라고 되어있음
USER라는 권한을 부여한다는 의미이므로 WebSecurityConfig.java 클래스의 configure(HttpSecurity http)안에
.antMatchers("url명").hasAuthority("USER")를 추가해준다면, USER 권한이 부여된 사용자면 이 url에 접속이 가능함

2. 알맞게 DAO, mapper 파일 등 수정

 

 

 

 

이제 테스트해보면 허용되지 않은 url에서는 401(인가 안됨)이 뜨는 것을 확인할 수 있다!

728x90