Closed yejun95 closed 10 months ago
<!-- JJWT API : DatatypeConverter 사용--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.2</version> </dependency> <!-- JJWT Implementation : Jwts 사용 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.2</version> </dependency> <!-- JJWT Jackson : Jwts 사용 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.2</version> </dependency>
package com.example.demo.jwt; import java.security.Key; import java.util.Date; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; import org.springframework.stereotype.Service; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; @Service public class JwtService { // 비밀키 생성 private static final String SECRET_KEY = "asafdasdfajijoijfiajoijawoiejfiojijojiefiowjef"; // 토큰 구현 메서드 public String createToken(String subject, long expTime) { if(expTime <= 0) { throw new RuntimeException("만료 시간은 0보다 커야함"); } // 시그니처 알고리즘 선택 SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; // 스트링 형태의 key를 바이트 단위의 key로 변환 // jaxb-api : DatatypeConverter byte[] secretkeyBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY); // signing key 생성 // SecretKeySpec = 자바에서 제공하는 암호화 키를 만드는 객체 Key signingkey = new SecretKeySpec(secretkeyBytes, signatureAlgorithm.getJcaName()); // 생성한 key 리턴 return Jwts.builder() .setSubject(subject) // 유저 아이디 .signWith(signingkey, signatureAlgorithm) // key와 알고리즘 .setExpiration(new Date(System.currentTimeMillis() + expTime)) // 현재 시간설정 .compact(); // build 마무리 } // 토큰을 boolean 으로 검증 // 아래 로직에서는 subject 값을 확인하기 위해 String 설정 public String getSubject(String token) { // plyload에 key, value 지정 Claims claims = Jwts.parserBuilder() .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET_KEY)) .build() .parseClaimsJws(token) // 토큰을 넣어 디코딩 .getBody(); // 데이터를 body로 받는다. (claim이 만들어진다) return claims.getSubject(); // 토큰의 subject 값을 가져온다. (= 유저아이디) } }
package com.example.demo.controller; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.example.demo.entity.User; import com.example.demo.jwt.JwtService; import com.example.demo.mapper.UserMapper; @RestController @RequestMapping(value = "/api") public class UserController { @Autowired UserMapper userMapper; @Autowired JwtService jwtService; // JWT 로그인 기능 구현 @PostMapping("/post/user/jwtLogin") public Map<String, Object> memJWTLogin(@RequestBody User vo) { User mvo = userMapper.memLogin(vo); if(mvo != null) { // 로그인 성공 // 토큰 생성 (유저 아이디, 만료 시간 2분) String token = jwtService.createToken(vo.getUserId(), (2*1000*60)); // 리턴할 map Map<String, Object> map = new LinkedHashMap<>(); map.put("result", token); return map; } else { Map<String, Object> map = new LinkedHashMap<>(); map.put("result", "bad"); return map; } } // 생선한 JWT 토큰 조회하기 @GetMapping("/get/subject") public Map<String, Object> getSubject(@RequestParam(value = "token") String token) { String subject = jwtService.getSubject(token); // 리턴할 map Map<String, Object> map = new LinkedHashMap<>(); map.put("result", subject); return map; } }
frontend에서 보낸 id와 pw를 userMapper를 통해 데이터를 찾고, 데이터가 있으면 토큰 생성 진행
userMapper
변수 mvo에 데이터가 있으면 로그인 성공이니 토큰이 생성되어 리턴된다.
mvo
로그인 실패 시 문자열 "bad"를 리턴한다.
로그인 성공
로그인 실패
생성한 토큰을 확인 get 요청
JwtService에서 생성한 getSubject 메서드를 이용하여 조회한다.
JwtService
getSubject
포스트맨 사용
파라미터에 로그인 성공했을 때에 토큰 값을 넣어준다.
subject
현재 토큰값 생성까지는 진행하였는데, 이걸 vue에서 어떻게 적용해야되는지 모르겠다.
더 찾아봐야함....
Reference
유튜브 성지채널 : SpringBoot 에서 JWT를 활용한 인증 구현하기
SpringBoot + JWT
✔ dependency 설정
✔ JwtService
✔ controller
frontend에서 보낸 id와 pw를
userMapper
를 통해 데이터를 찾고, 데이터가 있으면 토큰 생성 진행변수
mvo
에 데이터가 있으면 로그인 성공이니 토큰이 생성되어 리턴된다.로그인 실패 시 문자열 "bad"를 리턴한다.
로그인 성공
로그인 실패
생성한 토큰을 확인 get 요청
JwtService
에서 생성한getSubject
메서드를 이용하여 조회한다.포스트맨 사용
파라미터에 로그인 성공했을 때에 토큰 값을 넣어준다.
subject
값이 리턴되는걸 확인 (= 유저 아이디)현재 토큰값 생성까지는 진행하였는데, 이걸 vue에서 어떻게 적용해야되는지 모르겠다.
더 찾아봐야함....
Reference
유튜브 성지채널 : SpringBoot 에서 JWT를 활용한 인증 구현하기