Spring Security/security

[SpringBoot + Security + JWT + JPA ] 회원가입 , 로그인 구현하기-1

데이25 2023. 2. 1. 17:18

IDE : IntelliJ

 

 

https://start.spring.io/ 에서 프로젝트를 다음과 같이 생성해준다.

스프링 버전은 2.7.8로 해주었다. 

 

build.gradle 에 dependancy는 다음과 같이 설정해준다. 

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2:1.4.197'

    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
	compileOnly "org.springframework.boot:spring-boot-devtools"
    
    //JWT Dependency
    implementation 'io.jsonwebtoken:jjwt:0.9.1'
}

 

application.properties 는 application.yml로 변경하고 내용은 다음과 같다. 

spring:
  jpa:
    show_sql: true
    hibernate:
      dialect: org.hibernate.dialect.MySQL57Dialect
      ddl-auto: create
    generate-ddl: true
  datasource:
    hikari:
      jdbc-url: jdbc:h2:~/test
  h2:
    console:
      enabled: true

 

config 패키지를 만들고 SecurityConfig.java 클래스를 생성해준다.

그리고 web 패키지를 만들어 IndexController.java 클래스를 생성한다.

 

SecurityConfig.java

@RequiredArgsConstructor
@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf().disable() //1
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) //2
                .and()
                .formLogin().disable()
                .httpBasic().disable()

                .authorizeRequests()
                .antMatchers("/index/**","/h2-console/**").permitAll()
                .anyRequest().authenticated() //3
        ;
        return http.build();
    }
}

1. csrf 보안 토큰 disable처리한다는 의미다.

2. jwt 토큰기반의 인증을 진행할 것이기때문에 세션사용은 하지않는다. 

3. 위에 작성한 /index/** 와 h2-console/** 이외의 요청은 모두 인증을 받아야지만 접근이 가능하다.

    + 만약 모든요청에 대해 인증을 가능하도록 하고싶다면 anyRequest().permitAll() 을 하면된다.  

 

 

IndexController.java는 다음과 같이 작성해준다.

@RestController
public class IndexController {

    @GetMapping("/index")
    public String hello() {
        return "hello world";
    }
}

 

이제 스프링을 실행하고 localhost:8080/index 에 접속해본다. 

접속이 잘되는것을 확인할 수 있다.

 

그런데 localhost:8080/h2-console 을 들어가 로그인을하면 오류가난다. 

 

따라서 SecurityConfig를 다음과 같이 수정해준다. 

@RequiredArgsConstructor
@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf()
                    .ignoringAntMatchers("/h2-console/**")
                .and()
                .headers().frameOptions().sameOrigin()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
                .and()
                .formLogin().disable()
                .httpBasic().disable()

                .authorizeRequests()
                    .antMatchers("/login/**","/index/**","/h2-console/**").permitAll()
                    .anyRequest().authenticated() 

        ;
        return http.build();
    }

 

 

이제 다시 localhost:8080/h2-console에 들어가면 잘 나올것이다. 

 

 

다음시간에는 본격적으로 Member도메인을 만들고 JWT도 생성해보겠다.  

 

 

출처

 

GitHub - HomoEfficio/dev-tips: 개발하다 마주쳤던 작은 문제들과 해결 방법 정리

개발하다 마주쳤던 작은 문제들과 해결 방법 정리. Contribute to HomoEfficio/dev-tips development by creating an account on GitHub.

github.com