로그인 필터
jwt필터 등록
JwtAuthorizationFilter 등록

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 생성

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
로그인 결과화면

추가 로그인 oauth
Share article