JWT TOKEN을 테이블(TOKENTBL)을 통해 DB에 저장하는 방법

HUGO·2022년 9월 28일
0

JWT

목록 보기
1/4

데이터 베이스에 토큰 테이블 생성 (Oracle)

CREATE TABLE TOKENTBL(
    USERID VARCHAR2(30) CONSTRAINT PK_TOKEN_ID PRIMARY KEY,
    TOKEN VARCHAR2(200) NOT NULL,
    REGDATE TIMESTAMP DEFAULT CURRENT_DATE,
    CONSTRAINT FK_TOKENTBL_USERID FOREIGN KEY(USERID) REFERENCES MEMBERTBL(USERID)
);

dto파일에 TokenDTO.java 생성

package com.example.dto;

import java.sql.Date;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@NoArgsConstructor
public class TokenDTO {
    String userid;
    String token;
    Date regdate;    
}

MemberRestController.java에 login 코드

// 127.0.0.1:8080/BOOT1/api/member/login.json
    // application/json
    @PostMapping(value="/login.json")
    public Map<String, Object> loginPOST(
            @RequestBody MemberDTO member){
        System.out.println(member.toString());
        Map<String, Object> retMap = new HashMap<>();
        try {
            // string 권한으로 collection으로 변경
            String[] strRole = { member.getRole() };
            Collection<GrantedAuthority> role 
                = AuthorityUtils.createAuthorityList(strRole);
            
            //CustomDetailsService와 같은 역할
            UsernamePasswordAuthenticationToken
                upat = new UsernamePasswordAuthenticationToken(
                    member.getUserid(), member.getUserpw(), role);
            authenticationManager.authenticate(upat);

            String token = jwtUtil.generateToken(member.getUserid());
            // TOKENTBL에 아이디가 존재 한다면 insert 없으면 update를 한 다음 토큰 전송(토큰을 관리 해야 함.)

            retMap.put("status", 200);
            retMap.put("token" , token);
        }
        catch(Exception e) {
            e.printStackTrace();
            retMap.put("status", -1);
        }
        return retMap;
    }

TokenMapper.java 만들기

// 127.0.0.1:8080/BOOT1/api/member/login.json
    // application/json
    @PostMapping(value="/login.json")
    public Map<String, Object> loginPOST(
            @RequestBody MemberDTO member){
        System.out.println(member.toString());
        Map<String, Object> retMap = new HashMap<>();
        try {
            // string 권한으로 collection으로 변경
            String[] strRole = { member.getRole() };
            Collection<GrantedAuthority> role 
                = AuthorityUtils.createAuthorityList(strRole);
            
            //CustomDetailsService와 같은 역할
            UsernamePasswordAuthenticationToken
                upat = new UsernamePasswordAuthenticationToken(
                    member.getUserid(), member.getUserpw(), role);
            authenticationManager.authenticate(upat);

            String token = jwtUtil.generateToken(member.getUserid());
            // TOKENTBL에 아이디가 존재 한다면 insert 없으면 update를 한 다음 토큰 전송(토큰을 관리 해야 함.)

            retMap.put("status", 200);
            retMap.put("token" , token);
        }
        catch(Exception e) {
            e.printStackTrace();
            retMap.put("status", -1);
        }
        return retMap;
    }

resources/mapper 파일에 tokenMapper.xml 만들기

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.TokenMapper">

    <insert id="upsertToken" parameterType="com.example.dto.TokenDTO">
        MERGE INTO
            TOKENTBL                                 <!-- 토큰테이블에 USERID가 일치 하는게 있다면 TOKEN, REGDATE를 업데이트 하고 -->
        USING DUAL              
            ON USERID=#{userid}
        WHEN MATCHED THEN
            UPDATE SET TOKEN=#{token}, REGDATE=CURRENT_DATE
        WHEN NOT MATCHED THEN                                   <!-- 없다면 USERID,TOKEN,REGDATE를 추가한다 -->
            INSERT (USERID, TOKEN, REGDATE ) VALUES(#{userid},#{token}, CURRENT_DATE)
    </insert>

</mapper>

MemberRestController.java에 코드 추가


@Autowired
    TokenMapper tMapper;
    .
    .
    .
    .

@PostMapping(value = "/login.json")
    public Map<String, Object> loginPOST(
            @RequestBody MemberDTO member) {
        System.out.println(member.toString());
        Map<String, Object> retMap = new HashMap<>();
        try {
            // string 권한으로 collection으로 변경
            String[] strRole = { member.getRole() };
            Collection<GrantedAuthority> role = AuthorityUtils.createAuthorityList(strRole);

            // CustomDetailsService와 같은 역할
            UsernamePasswordAuthenticationToken upat = new UsernamePasswordAuthenticationToken(
                    member.getUserid(), member.getUserpw(), role);
            authenticationManager.authenticate(upat);

            String token = jwtUtil.generateToken(member.getUserid());
            // TOKENTBL에 아이디가 존재 한다면 insert 없으면 update를 한 다음 토큰 전송(어떤 아이디가 어떤 토큰을 발행 했는지 토큰을 관리 해야 함.)

            TokenDTO obj = new TokenDTO();
            obj.setUserid(member.getUserid());
            obj.setToken(token);
            int ret = tMapper.upsertToken(obj);

            retMap.put("status", 200);
            if (ret == 1) {
                retMap.put("token", token);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            retMap.put("status", -1);
        }
        return retMap;
    }

DB에 토큰이 잘 들어갔는지 확인

SELECT * FROM TOKENTBL;
profile
갓 신생아 개발자 이야기

0개의 댓글