프로젝트 생성
자바 버전은 11로 하였고 아래의 Dependencies를 추가해줍니다.
- Spring Web
- Spring Security
- Spring Data JPA
- H2 Database
- Lombok
- Validation
테스트 컨트롤러 생성
해당 프로젝트가 잘 작동하는지 테스트 하는 컨트롤러를 만들어줍니다.
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
public ResponseEntity<String> hello(){
return ResponseEntity.ok("hello");
}
}
- Postman으로 GET요청을 했을때 401인증오류가 뜨는 것을 볼수 있습니다.
SecurityConfig를 생성
이를 해결하기 위해 config패키지 안에 SecurityConfig를 생성합니다.
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers(
"/h2-console/**"
, "favicon.ico"
);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/hello")
.permitAll()
.anyRequest()
.authenticated();
}
}
@EnableWebSecurity
: 기본적인 Web보안을 활성화 하겠다는 의미authorizeRequests()
: HttpServeletRequest를 사용하는 요청들에 대한 접근 제한을 설정antMatchers("/api/hello").permitAll()
: api/hello 에 대한 접근은 인증 없이 접근을 허용anyRequest().authenticated()
: 나머지 요청에대해서는 인증을 받아야한다.
해당 작업을 완료하면 테스트 컨트롤러로 한 GET요청은 잘 작동 될 것입니다.
이제 간단하게 JWT를 위한 초기설정을 해보겠습니다.
application.yml 작성
spring:
h2:
console:
enabled: true
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
database-platform: org.hibernate.dialect.H2Dialect
defer-datasource-initialization: true
hibernate:
ddl-auto: create-drop
properties:
hibernate:
format_sql: true
show_sql: true
logging:
level:
com.example: DEBUG
jwt:
header: Authorization
secret: c2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQtc2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQK
token-validity-in-seconds: 86400
h2데이터베이스
사용create-drop
: SessionFactory가 시작될때 Dropproperties
: 콘솔창에서 SQL들을 보기좋게 보여주는 설정로깅레벨
: 디버그defer-datasource-initialization: true
: 스프링 2.5이상부터 테이블을 초기화 시켜줘야한다. DB초기화 전략!(data.sql을 쓰는경우 작성해줘야함)HS512
알고리즘을 사용할것이기 때문에 512bit(64Byte)이상의 Secret key를 사용해야함- 토큰 만료시간 : 86400초
User Entity 작성
@Entity
@Table(name = "user")
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@Column(name = "username", length = 50, unique = true)
private String username;
@Column(name = "password", length = 100)
private String password;
@Column(name = "nickname", length = 50)
private String nickname;
@Column(name = "activated")
private boolean activated;
@ManyToMany
@JoinTable(
name = "user_authority",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "authority_name")})
private Set<Authority> authorities;
}
Authority Entity작성
@Entity
@Table(name = "authority")
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Authority {
@Id
@Column(name = "authority_name", length = 50)
private String authorityName;
}
data.sql 쿼리문 작성
해당 쿼리문은 프로젝트 시작시 실행됩니다.
INSERT INTO USER (USER_ID, USERNAME, PASSWORD, NICKNAME, ACTIVATED) VALUES (1, 'admin', '$2a$08$lDnHPz7eUkSi6ao14Twuau08mzhWrL4kyZGGU5xfiGALO/Vxd5DOi', 'admin', 1);
INSERT INTO AUTHORITY (AUTHORITY_NAME) values ('ROLE_USER');
INSERT INTO AUTHORITY (AUTHORITY_NAME) values ('ROLE_ADMIN');
INSERT INTO USER_AUTHORITY (USER_ID, AUTHORITY_NAME) values (1, 'ROLE_USER');
INSERT INTO USER_AUTHORITY (USER_ID, AUTHORITY_NAME) values (1, 'ROLE_ADMIN');
JWT관련 라이브러리 추가
build.gradle에 아래의 코드를 추가합니다.
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'
이로서 초기설정은 끝이났습니다. Spring의 최신버전을 사용하게되면 프로젝트가 터지는 상황이 자주 발생하는데 이때 build.gradle
에서 Spring 버전을 내려주면 됩니다.
처음에 2.7.0으로 개발하다가 2.6.4로 내려주니 각종 빌드 오류들이 해결됐습니다.
다음에는 실습 예제를 통해 JWT를 구현해보도록 하겠습니다.
Reference
[무료] Spring Boot JWT Tutorial - 인프런 | 강의
Spring Boot, Spring Security, JWT를 이용한 튜토리얼을 통해 인증과 인가에 대한 기초 지식을 쉽고 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com