본문 바로가기

Dev

[ JWT ] JWT 사용하기 - 1

반응형
 

[ JWT ] JWT란 무엇일까?

JWT.IO JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties. jwt.io JWT(JSON Web Token) ✏️ JWT란 무엇인가? JWT는 RFC 7519 웹 표준으..

choppadontbiteme.tistory.com

 

 

JWT

 


✏️ [ 목표 ] JWT 맛보기


 

1. Spring Initalizer로 Project 생성

  • 셋팅 후 Generate 클릭, IDE로 오픈하기
  • Intelij IDE

2. test용 API 생성하기

  • controller package 추가
  • CpdmController 생성
  • Spring Boot Run
  • PostMan으로 Test 해보기
    • 401 Unauthorized가 뜰 것이다. 

 

3. 401 Unauthorized 해결 - Security 설정하기

  • config package 추가
  • Security 설정을 위한 SecurityConfig 클래스 생성
  • SpringBoot Run & PostMan으로 확인하기.

4. Datasource, JPA 설정하기

  • application.properties을 application.yml로 변경하기 (yml이 가독성이 더 좋다.)
  • application.yml 셋팅

5. Entity 생성하기

  • 생성될 DB 
  • entity package 생성하고 User, Authority 클래스 생성하기
    • User.java
      import com.fasterxml.jackson.annotation.JsonIgnore;
      import lombok.*;
      import javax.persistence.*;
      import java.util.Set;
      
      @Entity // 데이터베이스의 테이블과 1:1로 매칭되는 객체
      @Table(name = "user") // 테이블 이름을 user로 지정한다.
      @Getter // 여기서부터는 lombok 어노테이션, 자동으로 생성해준다. (실무에서는 사용에 주의해야 함)
      @Setter
      @Builder
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
      
          @JsonIgnore
          @Id // PK
          @Column(name = "user_id")
          @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동으로 증가
          private Long userId;
      
          @Column(name = "username", length = 50, unique = true)
          private String username;
      
          @JsonIgnore
          @Column(name = "password", length = 100)
          private String password;
      
          @Column(name = "nickname", length = 50)
          private String nickname;
      
          @JsonIgnore
          @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.java
      import lombok.*;
      import javax.persistence.*;
      
      @Entity
      @Table(name = "authority")
      @Getter
      @Setter
      @Builder
      @AllArgsConstructor
      @NoArgsConstructor
      public class Authority {
      
          @Id // pk
          @Column(name = "authority_name", length = 50)
          private String authorityName;
      }​
  • SpringBoot가 실행될 때 자동으로 Data를 넣어줄 수 있도록 data.sql을 만든다.
  • 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');
    • Spring Boot 2.5 버전부터는 data.sql 이 Hibernate 가 초기화되기 전에 실행된다. 
      따라서 Hibernate 초기화를 통해 생성된 스키마에 데이터를 입력하기 위해 data.sql 을 실행하려면
      application.properties(yml)에 spring.jpa.defer-datasource-initialization = true 를 추가해야한다.

 

6. H2 Console 결과 확인

  • H2 Console에 접근하기 위해 Security 설정하기
    (h2-console 하위 모든 요청, favicon관련 요청은 Spring Security 로직을 수행하지 않도록 한다.)
  • SecurityConfig.java에서 하단을 추가해준다.
    @Override
        public void configure(WebSecurity web) throws Exception {
            web
                    .ignoring()
                    //h2-console 하위 모든 요청, favicon관련 요청은 Spring Security 로직을 수행하지 않도록 한다.
                    .antMatchers(
                            "/h2-console/**"
                            ,"/favicon.ico"
                    );
        }​
  • Spring Boot Run을 하면 테이블이 생성되는 것을 확인할 수 있다.
  • http://localhost:8080/h2-console에 접속하여 실제 DB 확인하기.
  • Connect를 눌려 접속하게 되면, DB가 정상적으로 생성되었음을 확인할 수 있다.



 


 

 

Dev_cpdm

 

choppadontbiteme.tistory.com

반응형

'Dev' 카테고리의 다른 글

[ Network ] OSI 7 Layer - Physical Layer (1)  (0) 2022.05.17
[ JWT ] JWT 사용하기 - 2  (0) 2022.04.18
[ JWT ] JWT란 무엇일까?  (0) 2022.01.29
[Error] Java Dangling meta character '+' near index 0  (0) 2021.09.14
[ Vue3 ] Vue3 바뀐 점 정리  (0) 2021.09.10