본문 바로가기

웹 프로그래밍/BackEnd

로그인 - 쿠키와 세션

거의 모든 사이트에는 로그인 기능이 필수적으로 들어가 있다!

로그인이 정확히 무엇일까?

서버에는 많은 클라이언트의 개인적인 정보가 저장되어있다.(특히 사용자가 많은 서비스일수록!)

하지만 로그인이 없으면 누가 요청을 보냈는지 확인하지 못해 다른 사용자의 개인정보를 넘겨줄 수도 있다!

그래서 로그인이라는 인증을 통해서 특정 사용자 요청에 따른 데이터만 골라서 보내주는 것이다!!

 

 

다른 사이트를 보면 로그인 한번 하면 유지가 되던데 통신 연결이 계속 되어 있는건가?

아니다.

HTTP는 무상태 즉, stateless와 비연결성의 특성을 가지고 있기 때문에 한번 요청을 보내고 받게 되면 연결이 끊어지게 된다.

그러지 않고 계속 연결되어 있으면 서버에 과부하가 걸리게 된다.

 

 

그러면 매번 아이디, 비밀번호를 보내 인증을 해야하는 건데 어떻게 로그인 상태가 유지되는거지?

이문제를 해결하기 위해 쿠키와 세션이라는 것이 나오게 되었다.

 

 

쿠키는 뭘까?

쿠키는 서버가 사용자의 웹 브라우저에 저장하는 데이터이다!!

key-value형태로 이루어져 있으며 String으로만 이루어져 있다.

처음 인증하는 과정에서 서버가 클라이언트에게 쿠키를 생성해서 보내면 로컬의 웹 브라우저에 저장된다.

 

서버가 클라이언트에게 쿠키를 보낼때
Set-Cookie: <cookie-name>=<cookie-value>

 의 형식으로 헤더에 담아 보내준다.

이후에 클라이언트가 서버에 요청을 보낼때 쿠키를 포함해서 요청을 보내게 되면 서버는 "아하 A사용자가 데이터 요청을 보냈구나"라고 알게되고 그에 맞는 데이터를 리턴 해주는 것이다.

 

클라이언트가 서버쪽에 쿠키를 보낼때는
Cookie: <cookie-name>=<cookie-value>

와 같은 형식으로 헤더에 담아 요청을 보내게 된다.

 

그러면 클라이언트쪽에서는 로그인이 최초 한번만 필요하게 되는 것이다.(이후에는 로그인 대신 쿠키를 보냄)

 

 

그러면 한번 로그인 하면 평생 다시 안해도 되겠네?

아니다.

쿠키는 웹브라우저가 종료되면 제거된다.

 

어? 저는 종료하고 다시 들어가도 로그인이 되어 있던데요?

쿠키의 종류에는 두 가지가 있다.

session쿠키와 permanent쿠키가 있는데

session쿠키는 웹 브라우저가 종료될떄 사라지는 쿠키이고

permanent쿠키는 웹 브라우저가 종료되더라도 살아있지만 만료 기한을 정해줘야하는 쿠키이다.

 

permanent쿠키를 사용하고 싶으면 아래와 같이 서버에서 만료기한을 정해 보내주면 된다.

Set-Cookie: fansor_cookie=coding; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

 

이러한 쿠키가 있기 때문에 페이지가 바뀌더라도 로그인 상태를 유지 할 수 있는것이다.

 

근데 여기서 한가지 문제점이 있다.
쿠키에는 아이디와 비밀번호가 포함되어 있기 때문에 누군가 중간에 가로 챈다면?

큰일이 나게 된다.

특히 개인 소유가 아닌 컴퓨터에서 로그인했을때 누구나 쿠키를 통해 아이디, 비밀번호를 확인 할 수 있게 된다!!(예전에 피씨방에서 로그인하고 쿠키 안지우면 계정이 털린다는 소문이 쿠키 문제 때문 일 것이다..!! 아주 예전이지만)

 

 

그래서 나온것이 세션이다.

세션이 뭘까?

 

세션은 쿠키와 달리 인증 정보를 서버쪽에서 저장한다.

서버쪽이 클라이언트쪽 보다 보안상 안전하기 때문이다.

 

서버에서 인증정보를 가지고 있으면 클라이언트에서는 뭘 보내지?

sessionid를 보낸다!!

- 서버에서는 클라이언트가 처음에 서버에 로그인을 요청하게 되면 DB와 비교하여 로그인이 맞는지 확인한다.

- 확인하고 나면 서버측에서 sessionid를 생성하게된다. 

- 이 sessionid를 클라이언트 쪽에 쿠키로 보내는 것이다.

- 클라이언트는 서버에서 받은 쿠키(sessionid가 포함)를 브라우저의 쿠키로 저장하게 된다.

- 이후 클라이언트가 서버에 요청을 할때는 서버에서 받았던 쿠키(sessionid포함)와 함께 요청한다!!

 

즉, 쿠키내부에 아이디와 비밀번호가 매번 포함되는것이 쿠키여서 위험하니까 대신 로그인 했다는 것을 인증해주는 sessionid를 쿠키안에 담아서 보낸다!!

 

**sessionid는 역으로는 풀릴수 없게 생성되기 떄문에 sessionid를 안다고 하더라도 서버에 저장되어있는 아이디와 비밀번호를 알 수 없다!!

 

이 sessionid는 브라우저가 종료되면 사라지고 서버측의 sessionid정보도 사라지게 된다.

 

말로 길게 풀어놓으니 어렵게 느껴지는 데 그림으로 보면 이해가 쉽다!!

 

그러면 중간에  sessionid를 가로채면 로그인한것 처럼 위장할 수  있지 않을까?

그렇다..

sessionid를 쓰는 이유가 탈취당해도 서버에 있는 아이디와 비밀번호를 알 수 없게 하는 목적이므로 동일한 sessionid로 요청을 보내게 되면 로그인하지 않고 로그인한 효과를 낼 수 있다..

아직 공부를 많이 안해서 모르겠지만 이 문제를 해결하는 기술도 나오지 않았을까 싶다.

일단 지금까지 공부한 것을 종합해보면 sessionid는 브라우저를 종료하면 사라지니까 창을 잘 종료하자?!! 인가?..ㅎㅎ

 

아무튼 끝!

 

참고링크 : https://velog.io/@junhok82/%EB%A1%9C%EA%B7%B8%EC%9D%B8%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9D%B4%EB%A3%A8%EC%96%B4%EC%A7%88%EA%B9%8CCookie-Session

 

반응형
SMALL