본문 바로가기
공부/Spring Security

[Security] JWT를 위한 Security 설정

by yeaseul912 2022. 6. 28.
728x90

초기 셋팅은 일단 넘어가고

아래 처럼 Security 설정을 하도록 한다.

pom.xml이나  application.yml (초기 셋팅) 이 궁금하면 깃헙 일단 참고참고!

전체 구조

1. Model객체 생성

User.java

package com.cos.jwt.model;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.Data;

@Data
@Entity
public class User {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY) // auto increment
	private long id;
	
	private String username;
	private String password;
	private String roles;  // USER, MANAGER, ADMIM
	
	
	public List<String> getRoleList(){
		if(this.roles.length() > 0 ) {
			return Arrays.asList(this.roles.split(","));
		}
		return new ArrayList<>();   // null 방지 
	}
}

2. DB 접근을 위하여 Repository 생성

UserRepository.java

package com.cos.jwt.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.cos.jwt.model.User;

public interface UserRepository extends JpaRepository<User, Long>{

}

3. RestController 파일 생성

간단하게 사용할 페이지들을 맵핑해놓았다.

RestApiController.java

package com.cos.jwt.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;

//@CrossOrigin // 인증이 필요하지 않은 요청만 허용
@RestController
@RequiredArgsConstructor
public class RestApiController {

	@GetMapping("home")
	public String home() {
		return "<h1>home</h1>";
	}
	
	@PostMapping("token")
	public String token() {
		return "<h1>token</h1>";
	}
	
	@PostMapping("join")
	public String join() {
		return "<h1>회원가입완료</h1>";
	}
	
	// user, manager, admin 권한 접근 가능
	@GetMapping("/api/v1/user")
	public String user() {
		return "user";
	}
	
	// manager, admin 권한만 접근 가능
	@GetMapping("/api/v1/manager")
	public String manager() {
		return "manager";
	}
	
	// admin 권한만 접근 가능	
	@GetMapping("/api/v1/admin")
	public String admin() {
		return "admin";
	}
}

4. CorsConfig 생성

이 필터를 거치면 cors 정책에서 벗어날 수 있다.

(cross origin 요청이 와도 다 허용이 되도록 설정)

 Controller에 @CrosOrigin 을 걸어도 되지만 인증이 필요한 요청은 거부된다.

package com.cos.jwt.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

	@Bean
	public CorsFilter corsFilter() {
		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		CorsConfiguration config = new CorsConfiguration();
		config.setAllowCredentials(true); // 내 서버가 응답을 할 때 json을 자바스크립트에서 처리할 수 있게 할지 설정
		config.addAllowedOriginPattern("*"); // 모든 ip에 응답을 허용
		config.addAllowedHeader("*"); // 모든 header에 응답을 허용
		config.addAllowedMethod("*"); // (post,get,put,delete,patch) http method의 모든 응답 허용
		source.registerCorsConfiguration("/api/**", config);
		return new CorsFilter(source);
	}
}

 

5. SecurityConfig.java 생성

   Spring Sevuciry Filter Chain을 사용하기 위하여 WebSecurityConfigurerAdapter 를 상속받아주고

   Configure 를 override하여 Security 설정을 해준다.

    @Configuration : 해당 설정 파일을 Bean에 등록하는 어노테이션, 스프링에서 관리하게 함. => 싱글톤 유지

    @EnableWebSecurity : 스프링 시큐리티 사용을 위한 어노테이션 

package com.cos.jwt.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.web.filter.CorsFilter;

import lombok.RequiredArgsConstructor;

@Configuration // IoC
@EnableWebSecurity  // Security 활성화
@RequiredArgsConstructor 
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	private final CorsFilter corsFilter;
    
	@Override
	protected void configure(HttpSecurity http) throws Exception {

		http.csrf().disable();
		http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // seession방식 사용 x , stateless server로 사용.
		.and()
        	.addFilter(corsFilter) // @CrossOrigin은 인증x, 시큐리티 필터에 등록 인증o
        	.formLogin().disable() // jwt server니까 form login 사용 x
		.httpBasic().disable() // 기본적인 Http 도 안씀
		.authorizeRequests()
		.antMatchers("/api/v1/user/**").access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
		.antMatchers("/api/v1/manager/**").access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
		.antMatchers("/api/v1/admin/**").access("hasRole('ROLE_ADMIN')")
        	.anyRequest().permitAll();

	}
}

 

localhost:8080/home -> 잘뜸

localhost:8080/api/v1/user -> 403 권한 없음 에러

localhost:8080/api/v1/manager -> 403 권한 없음 에러

localhost:8080/api/v1/admin -> 403 권한 없음 에러

 

 

reference

[Spring] Spring-Spring-Security-JWT-로그인

[Spring] @Configuration 개념과 장점

반응형

'공부 > Spring Security' 카테고리의 다른 글

[Security] JWT생성과 로그인, 권한 관리  (0) 2022.06.28
[Security] 전체적으로  (0) 2022.04.22
[Security] 환경설정  (0) 2022.03.09

댓글