1. 쿠키(Cookie)
- 사용자가 웹사이트 접속시 사용자의 개인 장치에 다운로드되고 브라우저에 저장되는 작은 텍스트 파일
- 해당 사이트에 접속할 때마다 지속해서 해당하는 쿠키를 보내주고 이 쿠키를 이용하여 웹 사이트는 사용자의 장치를 인식하고 일부 데이터를 저장
2. 구현
2-1. 개념
- 쿠키를 사용하여 로그인 기능 구현
- 로그인 성공시 서버는 쿠키에 사용자 정보를 담아 브라우저에 전달, 브라우저는 해당 쿠키 저장
- 서버에서 이 쿠키를 확인해 로그인 했는지와 유저 정보, 권한 등을 확인할 수 있음
2-2. 쿠키 생성
- jakarta.servlet.http에 Cookie라는 클래스 사용
- 쿠키 생성 시 key, value 쌍으로 값을 넣어줄 수 있음
Cookie cookie = new Cookie("key", "value")
- 유효 시간을 설정할 수 있음
cookie.setMaxAge(60 * 60); // 유효 시간 : 1시간
- 설정이 끝난 쿠키를 서버 응답 객체(HttpServletResponse)에 addCookie 메소드를 이용해 쿠키를 전송
response.addCookie(cookie);
2-3. 쿠키 확인
- @CookieValue 어노테이션을 사용하면 쿠기 value를 받아 올 수 있음.
@CookieValue(name="user")
- HttpServletRequest는 특정 이름의 Cookie를 구하는 메소드가 없기 때문에 getCookies 메소드와 반복문을 사용하여 원하는 이름의 Cookie를 얻을 수 있다.
Cookie[] cookies = request.getCookies();
for (Cookie checkCookie : cookies) {
# "user"는 찾고자하는 쿠키의 key
if (checkCookie.getName().equals("user")) {
...
...
}
}
2-4. 쿠키 파기
- 쿠키를 파기하는 방법은 생성했던 쿠키와 똑같은 Key 값을 넣어주고 Value를 null로 설정하여 생성
Cookie cookie = new Cookie("user", null);
- 해당 쿠키의 setMaxAge(0)을 통해 유효 시간을 0초로 설정
cookie.setMaxAge(0);
- 해당 쿠키를 다시 HttpServletResponse 의 addCookie를 통해 쿠키를 파기할 수 있음
response.addCookie(cookie);
3. 문제점
- 쿠키 값을 임의대로 변경할 수 있음
- 쿠키에 보관된 정보를 타인이 훔쳐갈 수 있음
- 한 번 도용된 쿠키 정보는 계속 악용될 수 있음
위변조 및 도용이 쉽다는 문제가 있다. 이런 문제점을 해결하기 위해서 중요 정보들은 클라이언트가 아닌 서버에서 관리하고 그게 외부로 노출되지 않도록 해야한다.
클라이언트는 서버가 보관하고있는 중요 정보에 접근할 수 있는 key만 가지고 있고, 이 key 또한 유효시간을 짧게 둬서 갱신되도록 한다면 보안적으로 보다 안전해 질 것이다. 이러한 방식으로 정보를 보관 및 연결 유지하는 것을 세션 이라고 한다!
4. Reference
[Spring Boot] Cookie를 사용한 로그인 구현
로그인 처리 1- 쿠키, 세션