| 세션과 쿠키(Session, Cookie)
웹 서비스는 기본적으로 HTTP프로토콜을 기반으로 동작합니다.
HTTP프로토콜은 클라이언트와 서버와의 관계를 유지하지 않는 특징인 Stateless 기반인 프로토콜 입니다.
따라서 만약 웹사이트들을 방문 시 HTTP프로토콜만으로 통신을 한다면 매 페이지를 이동할 때 마다
계속해서 서버와의 연결을 해야하는 불편함이 생기게 됩니다.
또한 사용자의 요청마다 서버와 매번 새로운 연결이 생기기 때문에 로그인 상태유지 장바구니 등의 기능을
구현하는 것이 매우 까다로워 집니다.
그렇기에 이러한 문제점을 해결하기 위해 나온 것이 | 세션과 쿠키(Session, Cookie) 입니다.
두 개의 차이점은 세션은 서버에서 연결 정보를 관리하는 방면 쿠키는 사용자 측에서 연결 정보를 관리하는데 차이가 있습니다.
| 쿠키(Session, Cookie)
쿠키란?
쿠키란 클라이언트가 서버에서 받은 쿠키를 저장하고 HTTP 요청시 서버로 전달 하는 것 입니다.
쿠키라 함은 쉽게 얘기해서 나의 정보를 이 웹사이트에 등록을 해놓으면 그 정보를 담고 있다가
사용자가 다음번에도 이 사이트에 오면 쿠키에 들어있는 정보를 꺼내서 클라이언트에 등록하는것 입니다.
| 세션과 쿠키의 차이점 (Session, Cookie)
Session 이랑 Cookie 둘 다 정보를 가지고 있는데 정보를 가지고 있는 곳이 다르다.
Session은 서버에 정보가 저장되어있고 Cookie 는 클라이언트에 정보가 저장되어 있다.
성능을 위해서 두 개를 적절하게 나눠쓴다고 하는데, 상황에 맞게 사용하면 될 것 같다.
이 예시는 쿠키를 사용하지 않았을때 입니다.
클라이언트에서 정보를 주고 서버에서 이 사용자를 검증 후 응답을 보냅니다.
일단 HTTP는 기본적으로 무상태(Stateless) 프로토콜 입니다.
HTTP 프로토콜의 특징으로는
1.클라이언트와 서버와 응답을 주고 받으면 연결이 끊어진다.
2.클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.
3.클라이언트와 서버는 서로 상를 유지하지 않는다.
이러한 특징으로 인해 클라이언트(사용자)는 서버 접속할때마다 자신이 소유자임을 계속해서 인증해야 합니다. 매우 불편한 행동이죠. 그렇기 때문에 이러한 쿠키가 필요한 것 입니다.
| 쿠키(Session, Cookie)의 동작 방식
웹 브라우저가 요청을 보내 정보를 서버에 주면 서버는 쿠키란 곳에 정보를 담습니다.
이제 그 사용자가 다음번에 이 서버에 방문할때는 서버는 이 사용자의 정보가 있는지 쿠키에 찾습니다.
있다면 쿠키의 있는 값을 줍니다.
| 쿠키(Session, Cookie)의 사용방법
일단 쿠키를 사용하기 위해서는 두 가지가 필요합니다.
쿠키의 들어갈 Key값과 Value 값이 필요합니다.
기본적으로 쿠키는 회원이 로그인하면서 정보를 입력할때 이 값들을 쿠키에 담기때문에
로그인하는 메서드부분에 작성해주어야 합니다.
일단 newCookie로 만들어 파라미터 안에 키값과 밸류값을 넣으면 됩니다.
키 값은 아무거나 입력해도 상관없습니다.
하지만 해쉬맵 처럼 꺼낼때는 키 값이 동일해야 합니다.
그 후 밸류 값은 들어갈 정보를 넣으면 됩니다.
기본적으로 밸류 값은 String 타입이기 때문에 변환 후 넣어줘야 합니다.
이렇게 다 넣었다면 쿠키가 만들어 집니다.
그 후에 만든 후 응답할때 실어서 보내줘야 하기때문에 Reponse 객체에 쿠키를 실어주면 끝입니다.
그러면 응답헤더에 쿠키가 들어가게 되고 클라이언트에 쿠키가 저장됩니다.
이렇게 response 객체에 실어서 보내주면 이 쿠키는 클라이언트에 저장됩니다.
그렇다면 이제 클라이언트에 쿠키가 저장되어 있기 때문에 꺼낼때도 쉽게 꺼낼 수 있습니다.
저는 스프링부트를 사용하여 꺼냈습니다.
@Cookie에는 name = 꺼낼 키 값 ,
required = (true) 쿠기가 있으면 쿠키를 가져오고 없으면 쿠키 생성
required = (false) 쿠기가 있으면 쿠키를 가져오고 없으면 쿠키 생성 X
그렇게 쿠키를 가져와서 쿠키가 있으면 로그인성공을 하고 없으면 되돌리는 로직을 만들었습니다.
주의할 점: 쿠키를 꺼내기 위해선 Reponse에서 넣었던 키값이랑 꺼낼 키값이랑 반드시 같아야 합니다.
이렇게 쿠키를 넣고 꺼내는 방법은 별로 어렵지 않습니다
하지만 이 방식에는 치명적인 오류가 존재합니다.
| 쿠키(Session, Cookie)의 보안오류
쿠키는 기본적으로 변조가 쉽기 때문에
만약 이렇게 쿠키에 중요한정보들을 넣어서 서버에 쿠키들을 노출시킨다면
많이 위헙합니다.
저희가 만든 키값이 그대로 노출되기 때문에 memberId를 키로 했던 것이 기억 나시나요?
거기에 있는 키 값이 매우 쉽기 때문에 이 키 값들을 추정이 가능합니다.
쿠키는 변조가 정말 쉽기 때문에 보통은 jwt토큰을 사용하거나 세션기반으로 로그인 방식을
유지하고있습니다.
| 쿠키(Session, Cookie)는 사용해야 하나? 말아야 하나?
쿠키를 사용하는 것은 개발자의 몫입니다만 하지만 요새 기술트렌드를 본다면
jwt토큰등을 많이 사용하는 추세로 자리 잡고 있습니다.
즉 로그인 기반 방식을 쿠키로만 관리하는 것은 위험한 발상이며 , 여러 보안등을 적용할 필요가 있습니다.
| 쿠키 요약
쿠키는 매우 변조가 쉽다. 그렇기 때문에 쿠키는 되도록이면 사용하지말자.
쿠키의 사용방법은 new Cookie에 키,밸류 값을 담아서 Reponse 객체에 실는다.
그러면 응답시 쿠키의 값들은 Reponse 객체에 담겨 서버 쿠키에 저장이 된다.
'[자바]스프링' 카테고리의 다른 글
[스프링] 인터셉터[Interceptor]의 원리와 개념 그리고 활용 (0) | 2023.06.01 |
---|---|
[스프링] Spring에서 세션이란? 세션의 이해와 원리 그리고 로그인 (0) | 2023.05.31 |
스프링 querydsl 의존성 추가 스프링 부트 3.0.0이상 gradle 5.0이상 (1) | 2023.05.05 |
bindingresult,rejectValue의 이해와 원리 (1) | 2023.05.05 |
@AutoWired의 원리 , AutoWired란? (1) | 2023.05.02 |