jwt의 access_token과 refresh_token를 구현하는 과정에서 프로젝트 프론트 팀원분이
refresh_token은 쿠키에 담아서 전송해달라는 요청이 들어왔다.
과정은 대략 아래와 같다.
전송방식은 Http Only 방식으로 쿠키에 담아 전송하였다.
httpOnly란 Set-Cookie HTTP reponse 헤더에 포함되는 flagf이다.
cookie를 생성할 때 HttpOnly를 사용하는 것은 브라우저가 HttpOnly를 지원할 경우 쿠키는 클라이언트 측 스크립트에 접근할 수 없다. 악성 스크립트(XSS 공격)에 의한 위험을 완화시켜준다.
즉, http only 쿠키 방식으로 저장된 정보는 Javscript의 Document.cookieAPI로 접근이 불가능하다. 따라서 XSS 취약점 공격으로 담긴 값을 불러올 수 없다. 또한 CSRF 공격도 막을 수 있다.
로그인 이후 서버에선 refreshToken은 Header의 Set-Cookie에 담고 accessToken은 JSON Body에 담아서 보내기로 정하였다.
예제 코드
@GetMapping("/login")
@ResponseBody
public ResponseEntity<?> login(@RequestBody String credentials, HttpServletResponse response) {
// create a cookie
Cookie cookie = new Cookie("platform","mobile");
// expires in 7 days
cookie.setMaxAge(7 * 24 * 60 * 60);
// optional properties
cookie.setSecure(true);
cookie.setHttpOnly(true);
cookie.setPath("/");
// add cookie to response
response.addCookie(cookie);
// TODO: add your login logic here
String jwtToken = "NOT_AVAILABLE";
// return response entity
return new ResponseEntity<>(jwtToken, HttpStatus.OK);
}
프로젝트에 적용한 코드는 다른 로직도 들어가있어 복잡하다. 그래서 쿠키방식을 위를 참고하여 구현하였다.
참고
dzone.com/articles/how-to-use-cookies-in-spring-boot
attacomsian.com/blog/set-cookie-with-response-entity-in-spring-boot
'Tech > Spring' 카테고리의 다른 글
Google 소셜 로그인 Google API 클라이언트 라이브러리 + GoogleIdTokenVerifier 사용하는 방법 (4) | 2021.03.15 |
---|---|
Spring Boot Validation 순서 정하기 & 테스트 코드 (4) | 2021.03.15 |
@Controller와 @RestController의 차이점 (2) | 2021.02.12 |
[취준생을 위한 스프링부트 백엔드 프로그래밍] 3주차 과제 (0) | 2021.01.26 |
[취준생을 위한 스프링부트 백엔드 프로그래밍] 2주차 과제 (0) | 2021.01.21 |