JWT 인증

JWT 초기 설정

쿠카이든 2022. 9. 16. 10:59
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

 

[Spring] JWT(Json Web Token) 초기설정

프로젝트 생성 자바 버전은 11로 하였고 아래의 Dependencies를 추가해줍니다. Spring Web Spring Security Spring Data JPA H2 Database Lombok Validation 테스트 컨트롤러 생성 해당 프로젝트가 잘 작동하는지..

sbs1621.tistory.com

 

728x90