이번에 지인들과 게임을 만들기로 했다 나는 서버를 맡았다. 로그인 정보를 넘겨주면 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());
}
}
'몰아 넣기' 카테고리의 다른 글
[java] 날짜와 시간 다루기 (0) | 2022.06.10 |
---|---|
[Spring/java] Environment.acceptsProfiles() 사용하여 개발환경알기 (0) | 2022.04.02 |
[java/자바] .orElseThrow() 및 .ifPresent() 그리고 Stream().findFirst() 활용하기 (0) | 2022.03.08 |
[자바/Java] .toUpperCase() (0) | 2022.03.07 |
[자바/JAVA] 자바8 steam anyMatch() (0) | 2022.02.26 |