Front-End
인증 - 인가 본문
인증 : 사용자의 신원을 검증하는 프로세스를 뜻한다.
즉, ID와 PW를 통해 로그인하는 행위를 인증이라고 한다.
인가 : 인증 이후의 프로세스인데,
인증된 사용자가 어떠한 자원에 접근할 수 있는지를 확인하는 절차다.
HTTP의 stateless
웹 사이트는 HTTP통신 위에서 동작한다.
웹 사이트 내의 모든 요청과 응답은 stateless한 특성을 가진다고하는데, 이는 서버에서 Client의 이전 상태를 기억하고 있지 않다는 뜻이다.
HTTP의 stateless라는 특성을 인증과 함께 생각해보면 로그인을 통해 인증을 거쳐도 이후 요청에서는 이전의 인증된 상태를 유지하지 않게 된다. 이러한 상황에서 웹사이트를 이용하려면 인증/인가가 필요한 모든 상황에서 사용자는 반복적으로 ID/PW를 입력해야하는 불상사가 생기게 될 것이다.
구현 방법으로는 세가지를 예를 들 수 있다.
1. Cookie(쿠키)
2. Session
3. Token
자 한번 공부를 다시 제대로 해보면서 이해하고 알아보자.
1. Cookie (쿠키)
쿠키란 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 데이터 파일인데,
key-value로 구성되고, string 형태로 이루어져있습니다.
유효시간을 명시할 수 있으며, 유효시간이 정해지면 브라우저가 종료되어도 유지된다.
클라이언트 상태로 로컬에 저장했다가 참조하여 정보를 가져옵니다.
300개까지 저장이 가능하고, 도메인당 20개의 값만 가질 수 있다고합니다.
사용하는 이유 : 세션 관리(로그인, 접속시간 등 서버가 알아야할 정보를 저장할 때 사용한다)
개인화(사용자마다 다르게 적절한 페이지가 보이도록 할 때 사용한다)
트래킹(사용자의 행동과 패턴을 분석하여 기록할 때 사용한다)
단점 : 방문한 웹 사이트에 대한 정보 및 개인정보가 기록되어 사생활을 침해할 수 있다.
사용자에게 저장되기 때문에 임의로 고치거나 삭제가 가능하며, 보안이 취약하다.
매번 헤더에 쿠키에 대한 정보를 추가해서 보내기 때문에 상당한 트래픽을 발생시킨다.
2. session
서버에서 일정시간 동안 클라이언트 상태를 유지하기위해 사용한다.
서버에서 클라이언트 별 유일한 세션 ID를 부여하고, 세션 정보를 서버에 저장한다.
세션 ID란 사용자의 주요정보가 아닌, 단지 사용자를 식별할 수 있는 값을 생성하는데 -> 이점에서 쿠키와 다르게 보안성이 강화된다.
서버에서 생성한 세션 ID는 클라이언트의 쿠키 값(세션 쿠키)으로 저장되고,
클라이언트에서 요청을 보낼 때 세션 쿠키를 같이 보낸다.
서버에서 클라이언트별 세션 쿠키값이 저장되어있으니, 요청으로 온 세션 쿠키 값을 보고 어떤 클라이언트인지 식별할 수 있다.
이점을 보면, 클라이언트는 쿠키값을 보고 자신이 어떤 클라이언트로 저장되어있는지 식별할 수 없지만, 서버에서는 식별해서 확인 할 수 있다는 점이 보완성이 좋다고 생각이 든다.
단점 : 사용자를 식별할 수 있는 세션 ID값을 생성하고, 서버에 저장해야하는 작업이 생긴다.
서버 세션 저장소를 사용하므로 요청이 많아지면 서버 부화가 심해진다.
3. JWT ( JSON Web Token )
JWT는 인증에 필요한 정보들을 암호화 시킨 토큰이다.
JWT 토큰은 HTTP 헤더에 담아 서버가 클라이언트를 식별한다.
구조는 Header, payload, signature 로 되어있는데,
payload에 claim이 포함되는 영역으로 토큰을 담을 정보를 갖고있는다.
claim은 key-value형식으로 이루어진 한쌍의 정보로, 주로 사용자에 대한 속성을 설명한다.
뭐.. 클라이언트 고유 ID나 유효기간등이 포함되는 영역이라고한다.
signature는 인코딩된 Header와 payload를 더한뒤 secret key로 해싱해서 생성하는데,
해싱되는 방법은 Header에 지정한 해쉬 알고리즘으로 한다.
인코딩 된 값이여서 누구든 복호화가 가능할수 있지만, signature는 서버쪽에서 관리하는 키가 있어야 복호화가 가능해서 위변조 여부를 확인할 수있다.
장점 : 동시 접속자가 많더라도 서버 부하를 낮출 수 있다.
클라이언트, 서버가 다른 도메인을 사용할 때 사용 가능하다.
인증 정보를 서버에 별도로 저장할 필요가 없다. -> 서버의 stateless(무상태) 특성이 유지된다.
단점 : 구현 복잡도가 증가한다.
JWT에 담는 내용이 커질수록 네트워크 비용이 증가한다.
이미 생성된 JWT를 일부만 만료시킬 방법이 없다.(유효기간을 너무 길게 잡으면 안된다)
secret key 유출 시 JWT 조작이 가능하다.
payload 자체는 암호화되지 않기 때문에 사용자의 중요한 정보는 담을 수 없다.
아래는 순서대로 쿠키, 세션, JWT 의 작동 방법인데,
눈으로 익혀서 이해하면 좋을 듯하다 .