Notice
Recent Posts
Recent Comments
Link
«   2026/09   »
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
Archives
Today
Total
관리 메뉴

helloworld

JWT 를 위한 Security 설정 본문

jwt

JWT 를 위한 Security 설정

hellojava 2023. 10. 19. 14:58

여태 이론적으로 공부를 맛봤고 본격 코딩작업에 들어간당.

 

jwt를 사용하기 위해 config설정을 해줄게 조금 있었다.

 

우선 프로젝트를 생성 할 때 lombok,jpa,security,web,devtools,db를 넣어준다. 

 

 

그 후 mavenrepository에서 jwt를 위한 dependency를 가져와 추가한다.

https://mvnrepository.com/

 

나는 버전이 높고 사람들이 가장 많이 사용한 버전을 가져와 추가하였다.

 

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation group: 'com.auth0', name: 'java-jwt', version: '4.4.0'

compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}

기본적인 세팅은 완료가 되었고 controller와 model, config파일을 우선 만들었다.

 

controller는 @RestController를 이용하여 restapi를 사용하기 위해 준비 해놓았고

 

model에는 간단히 Users파일을 만들어놓았다.

 

@Entity
@Data
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String username;
private String password;
private String roles;//user,admin

public List<String> getRoleList() {
if (this.roles.length() > 0) {
return Arrays.asList(this.roles.split(","));
}
return new ArrayList<>();
}
}

roles는 유저의 사용자 권한인데 user, admin등 여러개가 들어 갈 수 있다고 판단하여 roles라고 지정 해 놓은 후

권한이 여러개인 유저는 , 으로 구분하여 리턴받을 수 있도록 하였다.

 

그 후 config에 SecurityConfig, CorsConfig 파일 만들었다. 

우선 CorsConfig에 configuration 이라는 어노테이션을 달고, CorsFilter라는 객체로 메서드를 만든 후 빈으로 등록해주었다.

 

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

 

 

 

@Configuration
@EnableWebSecurity
@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)//세션 사용안함
.and()
.addFilter(corsFilter)//@CorssOrigin(인증X) , 시큐리티필터에 등록 인증(0)
.formLogin().disable()//form로그인 안씀
.httpBasic().disable()
.authorizeRequests()
.antMatchers("/api/v1/users/**")
.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();
}
}

 

form로그인과  세션을 사용한다는 내용과 권한에 대한 내용이다.

또한 만들어놓은 filter로 필터도 추가해 놓았다.

 

httpBasic방식은 쿠키와 세션을 사용하지 않는다고 생각할 때 기존의 httpBasic방식은 header의 authorization이라는 키값에 id와 pw를 담아서 보낸다. 하지만 노출이 된다면 보안적으로 굉장히 불리하기 떄문에 https(secure)를 사용하면 암호화가 되긴 한다. 

 

하지만 Bearer인증방식은 authorization 에 id,pw를 토큰에 넣어서 보낸다. 기존 basic 방식보다 보안적으로 안전한 방식이다. 물론 똑같이 노출이 되면 안되지만 노출이 되어도 서버쪽에서 토큰을 계속 만들어 주기 때문에 안전한 방식이라고 한다. 

 

이 토큰을 만들 때 JWT 을 만드는 것이다. 이 방식을 사용하기 떄문에 session방식도 사용 안하고 basic,formlogin 등을 하지 않는다고 선언 하는 것이다.

 

'jwt' 카테고리의 다른 글

jwt를 위한 강제 로그인  (1) 2023.10.20
jwt 임시 토큰 만들어보기  (2) 2023.10.19
JWT 구조 이해  (2) 2023.10.18
RFC 문서  (0) 2023.10.18
RSA  (2) 2023.10.10