1. jwt 로그인

강재영's avatar
Dec 18, 2024
1. jwt 로그인

로그인 필터

jwt필터 등록

JwtAuthorizationFilter 등록
notion image
 
package shop.mtcoding.todayhome.core.filter; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import jdk.swing.interop.SwingInterOpUtils; import org.springframework.stereotype.Component; import shop.mtcoding.todayhome.core.util.JwtUtil; import shop.mtcoding.todayhome.core.util.Resp; import shop.mtcoding.todayhome.user.User; import java.io.IOException; import java.io.PrintWriter; public class JwtAuthorizationFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; String accessToken = req.getHeader("Authorization"); if(accessToken == null || accessToken.isBlank()){ System.out.println("토큰 없음"); resp.setHeader("Content-Type","application/json; charset=utf-8"); PrintWriter out = resp.getWriter(); Resp fail = Resp.fail(401, "토큰이 없어요"); String responseBody = new ObjectMapper().writeValueAsString(fail); out.println(responseBody); out.flush(); return; } try { User sessionUser = JwtUtil.verify(accessToken); System.out.println("id-- : " + sessionUser.getId()); System.out.println("username-- : " + sessionUser.getUsername()); HttpSession session = req.getSession(); session.setAttribute("sessionUser", sessionUser); chain.doFilter(req, resp); }catch (Exception e){ // resp.setHeader("Content-Type","application/json; charset=utf-8"); resp.setContentType("application/json; charset=utf-8"); PrintWriter out = resp.getWriter(); Resp fail = Resp.fail(401, e.getMessage()); String responseBody = new ObjectMapper().writeValueAsString(fail); out.println(responseBody); out.flush(); } } private void failJWT(){ } }
 

jwt토큰 생성 및 검증로직등록

Jwt 생성 및 검증 util 생성
notion image
 
package shop.mtcoding.todayhome.core.util; import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import shop.mtcoding.todayhome.user.User; import java.util.Date; public class JwtUtil { public static String create(User user){ String accessToken = JWT.create() .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7)) .withClaim("id",user.getId()) .withClaim("username", user.getUsername()) .sign(Algorithm.HMAC512("meta")); return accessToken; } public static User verify(String jwt){ jwt = jwt.replace("Bearer ", "").trim(); DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC512("meta")).build().verify(jwt); int id = decodedJWT.getClaim("id").asInt(); String username = decodedJWT.getClaim("username").asString(); System.out.println("id: " + id); System.out.println("username: " + username); return User.builder() .id(id) .username(username) .build(); } }

로그인 요청과 응답 과정

 

Requset

{ "username":"ssar", "password":"1234" }

controller

@PostMapping("login") public ResponseEntity<?> login(@RequestBody UserRequest.LoginDTO loginDTO){ UserResponse.LoginDTO responseDTO = userService.로그인(loginDTO); return ResponseEntity.ok() .header("Authorization","Bearer " + responseDTO.accessToken()) .body(Resp.ok(responseDTO)); }
 

Service

public UserResponse.LoginDTO 로그인(UserRequest.LoginDTO loginDTO) { User userPS = userRepository.findByUsernameAndPassword(loginDTO.getUsername(), loginDTO.getPassword()) .orElseThrow(() -> new ExceptionApi401("아이뒤 또는 이메일이 틀렸습니다.")); String accessToken = JwtUtil.create(userPS); return new UserResponse.LoginDTO(accessToken, userPS); }

repository

public interface UserRepository extends JpaRepository<User, Integer> { @Query("select u from User u where u.username=:username and u.password=:password") Optional<User> findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
 
 

로그인 응답 postman

notion image
 
notion image
 

생성된 토큰

Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpZCI6MSwiZXhwIjoxNzI5NzU2NTY1LCJ1c2VybmFtZSI6InNzYXIifQ.WuQMqetQWIQqRrueLwfK74bI_eLZmLdo39NOtJHsWS-ONMYzFMsxnWhk5G0nnrVCjxWHu3xNyxMQuz2aL0zmWQ

로그인 결과화면

notion image

추가 로그인 oauth

 
Share article

강재영 블로그