튜토리얼 코드

https://github.com/SilverNine/spring-boot-jwt-tutorial

바로가기

Spring Boot JWT Tutorial (1) – JWT 소개, 프로젝트 생성

Spring Boot JWT Tutorial (2) – Security 기본 설정, Data 설정

Spring Boot JWT Tutorial (3) – JWT 코드, Security 설정 추가

Spring Boot JWT Tutorial (4) – Repository, 로그인

Spring Boot JWT Tutorial (5) – 회원가입, 권한검증

Security 기본 설정

/api/hello로 접근했을때 401Unauthorized 가 리턴되었던 부분을 해결하기 위해 Security 기본설정을 진행하겠습니다.

우선 config 패키지를 만들고 SecurityConfig.java 파일을 생성합니다.

@EnableWebSecurity 는 기본적인 Web 보안을 활성화 하겠다는 어노테이션이고, 추가적인 설정을 위해서 WebSecurityConfigurer을 implements하거나 WebSecurityConfigurerAdapter를 extends하는 방법이 있습니다. 

여기서는 WebSecurityConfigurerAdapter을 extends하여 설정을 진행했습니다. 

configure 메소드를 오버라이드하여 /api/hello에 대한 접근이 인증없이 접근될 수 있도록 허용합니다.

authorizeRequests()는 HttpServletRequest를 사용하는 요청들에 대한 접근제한을 설정하겠다는 의미이고, antMatchers(path).permitAll() 는 해당 path로 들어오는 요청은 인증없이 접근을 허용하겠다는 의미 입니다.

.anyRequest().authenticated()는 나머지 요청은 모두 인증되어야 한다는 의미입니다.

자 다시 서버를 시작하고 Postman으로 테스트를 해보겠습니다.

성공했습니다.

Data 설정

자 이제 본격적으로 JWT 튜토리얼을 위한 설정을 시작하겠습니다.

먼저 Data Store에 대한 설정을 진행하겠습니다.

Application.yml

application.properties 파일을 Refactor를 이용해 application.yml 로 파일명을 변경하겠습니다. ( 저는  yaml이 보기가 편하더라고요! )

우리는 이 튜토리얼에서 h2 Database를 사용할 것이고, Memory 상에 데이터를 저장하는 방식으로 진행할 것 입니다.

h2 console을 true로 설정하고 datasource에 대한 설정을 해줍니다.

jpa관련 기본 설정 및 Console 창에서 실행되는 sql을 보기위한 설정도 추가하겠습니다.

create-drop의 의미는 SessionFactory가 시작될 때 Drop, Create, Alter를 하고, 종료될때 Drop을 진행한다는 의미입니다.

Entity 생성

이제 Entity 패키지를 생성하고 User.java, Authority.java 파일을 만들겠습니다.

@Entity는 Database Table과 1:1로 매핑되는 객체를 뜻합니다.

@Table은 객체와 매핑되는 Database의 Table명을 지정하기 위해 사용합니다.

@Getter, @Setter, @builder, @AllArgsConstructor, @NoArgsConstructor 는 Lombok Annotation으로 Get, Set, Builder, Constructor 관련 코드를 자동으로 생성합니다.

( 실제 서비스 개발이 아닌 튜토리얼이니 Lombok 관련 기능을 부담없이 사용하도록 하겠습니다. )

@JsonIgnore는 서버에서 Json 응답을 생성할때 해당 필드는 ignore 하겠다는 의미입니다.

@Id는 해당 필드가 Primary Key임을 의미하고

@Column은 매핑되는 Database Column의 정보를 정의합니다.

@ManyToMany @JoinTable 부분은 쉽게 말해 User, Authority 테이블의 다대다 관계를 일대다, 다대일 관계의 조인 테이블로 정의합니다.

data.sql

Spring Boot 서버가 시작될때 마다 Table들이 새로 Create되기 때문에 편의를 위해 초기 데이터를 자동으로 Database에 넣어주는 기능을 활용하겠습니다.

/src/main/resources 하위에 data.sql 파일을 만들겠습니다.

이후부터는 Spring Boot 서버가 새로 시작될때 data.sql의 쿼리들이 자동으로 실행됩니다.

Security 설정 추가

위에서 만든 Entity가 실제로 Database에 생성이 되는지 확인하기 위해 h2-console을 이용합니다.

그 전에 Security 설정을 추가해줘야 h2-console에 접근을 할 수 있습니다.

h2-console 페이지의 접근은 Spring Security 관련 로직을 수행하지 않도록 configure(WebSecurity web)를 오버라이드한 메소드를 새롭게 추가합니다.

따라서 h2-console/하위 모든 요청, /favicon.ico에 대한 요청은 Spring Security 로직을 수행하지 않고 접근할 수 있게 됩니다.

Database

이제 서버를 다시 시작한 후 http://localhost:8080/h2-console에 접근하겠습니다.

서버를 시작하는 동안 Console 창에 Entity정보들을 기반으로 Database에 관련 정보들이 생성되는 것을 볼 수 있습니다.

브라우저로 http://localhost:8080/h2-console에 접근해보니 아래와 같이 h2 database에 연결하는 화면이 보입니다.

Connect를 눌러보면 우리가 만들었던 Entity들을 기반으로 Database에 관련 정보들이 생성된 것을 볼 수 있습니다. 그리고 데이터들도 잘 생성이 된 것을 확인할 수 있습니다.

이제 기본적인 Security 설정 및 Data 설정이 완료되었습니다.

다음 편에서는 JWT 관련 코드들의 개발을 진행하겠습니다.