이번에 지인들과 게임을 만들기로 했다 나는 서버를 맡았다. 로그인 정보를 넘겨주면 DB와 확인 후 토큰을 발급해주고 토큰을 확인해주는 서비스를 만들어야했기에 이번에 기회에 세션만 사용했지만 jwt를 알아보게되었다.

dependensy : https://mvnrepository.com

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.18.3</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

 

controller

package com.spring.boot.api.controller;

import com.spring.boot.api.service.MemberService;
import org.slf4j.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/member")
public class MemberController {

    private static final Logger logger = LoggerFactory.getLogger(MemberService.class);

    @Autowired
    private MemberService memberService;

    @PostMapping("/requestJwt") [1]
    public String createJwt(@RequestParam("id") String id) {
        return memberService.createJwt(id);;
    }

    @PostMapping("responseJwt") [2]
    public String getJwt(@RequestParam("jwt")String jwt) {
        return memberService.getJwt(jwt);
    }

}

[1] id를 가져오면 id를 가지고 토큰을 만들어 볼것이다.

[2] 토큰을 넘겨주면 토큰을가지고 decoding 할것이다.

 

[1]메소드 : createJwt()

{0}
private static final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

    {1}
    public String createJwt(String id) {
        return Jwts.builder()
                [1].setSubject(id) 
                [2].signWith(signatureAlgorithm, getSecretKeySpec(DatatypeConverter.parseBase64Binary("secretKey")))
                [3].setExpiration(new Date(System.currentTimeMillis() + 2 * 1000 * 60))
                .compact();
    }
    
    
   {2}
   public SecretKeySpec getSecretKeySpec(byte[] secretKeyBytes) {
        return new SecretKeySpec(secretKeyBytes, signatureAlgorithm.getJcaName());
    }

 

{1} : createJwt 메소드이다.

[1] 어떤변수를 토큰으로 만들것인지 변수값을 넘겨주면된다.

[2] 해싱 알고리즘과 시크릿 키를 설정할 수 있습니다.

      첫번째 자리 signatureAlgorithm는 {0} 을 넣어준다                                                                                        두번째 자리  {2}getSecretKeySpec메소드에 시크릿키를 byte로 변환한 값을 주어 객체를 받아온다.

[3] 만료시간을 설정

활용

[1] 처럼 해줘도 됬지만 

.claim("id", "아이디") 로 변수를 즉시 설정할 수 있다. 여러개가능

[2]메소드 : getJwt 


    public String getJwt(String jwt) {
        try {
            return Jwts.parser()
                    [0].setSigningKey(DatatypeConverter.parseBase64Binary("secretKey"))
                    [1].parseClaimsJws(jwt)
                    .getBody()
                    [2].getSubject();
        } catch (Exception e) {
            throw new RuntimeException("parseError : " + e.getMessage());
        }
    }

}​

[0] [1]메소드 : createJwt 와 같이 시크릿키를 셋팅해준다

[1] 토큰을 세팅

[2] decoding된 토큰의 subject를 볼 수 있다.  여기서는 id를 볼 수 있는것이다.

 

전체코드

controller

package com.spring.boot.api.controller;

import com.spring.boot.api.service.MemberService;
import org.slf4j.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/member")
public class MemberController {

    private static final Logger logger = LoggerFactory.getLogger(MemberController.class);

    @Autowired
    private MemberService memberService;

    @PostMapping("/requestJwt")
    public String createJwt(@RequestParam("id") String id) {
        return memberService.createJwt(id);
    }

    @PostMapping("responseJwt")
    public String getJwt(@RequestParam("jwt")String jwt) {
        return memberService.getJwt(jwt);
    }

}

 

service

package com.spring.boot.api.service;

import io.jsonwebtoken.*;
import org.springframework.stereotype.Service;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

import java.util.Date;

@Service
public class MemberService {

    private static final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

    public String createJwt(String id) {
        return Jwts.builder()
                .setSubject(id)
                .signWith(signatureAlgorithm, getSecretKeySpec(DatatypeConverter.parseBase64Binary("secretKey")))
                .setExpiration(new Date(System.currentTimeMillis() + 2 * 1000 * 60))
                .compact();
    }

    public String getJwt(String jwt) {
        try {
            return Jwts.parser()
                    .setSigningKey(DatatypeConverter.parseBase64Binary("secretKey"))
                    .parseClaimsJws(jwt)
                    .getBody()
                    .getSubject();
        } catch (Exception e) {
            throw new RuntimeException("parseError : " + e.getMessage());
        }
    }

    public SecretKeySpec getSecretKeySpec(byte[] secretKeyBytes) {
        return new SecretKeySpec(secretKeyBytes, signatureAlgorithm.getJcaName());
    }
}
복사했습니다!