728x90
프로젝트 생성
자바 버전은 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가 시작될때 Drop
- properties : 콘솔창에서 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로 내려주니 각종 빌드 오류들이 해결됐습니다.
출처 : https://sbs1621.tistory.com/3
728x90
'JWT 인증' 카테고리의 다른 글
[JWT] Illegal base64url character: ' ' 오류 (0) | 2023.08.21 |
---|---|
access token과 refresh token 의 차이(feat. JWT 인증) (0) | 2022.07.16 |