일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ...args
- .toLocalString()
- 1주차
- 2020년 준비
- 2주차
- 4주차
- 5주차
- array
- array method
- async
- authentication
- AWS
- codestates
- commit
- Cookie
- CSS
- Data Structre
- Data Structure
- DataSturcutre
- Date.now()
- DB에 사진 저장하기
- Dev log
- DOM
- EC2
- EC2로 웹 만드는 방법
- EC2와 S3 연결하기
- element
- Es5
- ES6
- event 객체
- Today
- Total
souvenir
20.09.09_Authentication(인증) 본문
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
Authentication Flow
인터넷 쇼핑 중에서 개인적으로 제일 즐겨 사용하는 곳은 네이버 쇼핑이다.(뜬금 홍보) 네이버 쇼핑에 들어가기 위해서는 당연히 로그인 과정을 거치게 되는데 이것이 바로 Authentication(인증) 과정이다. 인증은 서버 측에서 중요한 부분이다. 자칫하면 사용자의 중요한 정보가 노출이 되거나 비밀번호가 드러나면 해커들이 침입할 수 있기 때문이다. 이번 세션에서는 인증 과정을 위한 다양한 개념들을 익혔다.
그 중에 가장 우리가 흔히 듣는 방법은 쿠키를 발급하는 것이다. 쿠키를 발급하는 것은 접근할 수 있는 사람이라는 인증서를 준 것과 비슷하다.(access conrol) 이와 비슷하지만 다른 개념으로는 Authorization(권한 부여)이다. 권한 부여는 일단 들어오는 사람 모두에게 세션 객체를 주고, 확인된 사람만 특정 페이지에 들어갈 수 있도록 세션 아이디(권한)을 부여하는 방식이다. (보통은 express-session 모듈을 이용해 구현한다.)이는 쿠키와는 달리 서버 측에서 관리하고 저장하기 때문에 보안상 조금 더 안전한 과정이다.
세션(Session)
: 일정시간 동안 동일한 사용자에 대한 상태정보를 유지시키는 것
방문자가 웹서버에 접속하게 되면 방문자의 요구에 따른 정보를 저장하는 것을 의미함
session
: 서버와 클라이언트의 연결이 활성화된 상태
-
인증을 통해 서버가 클라이언트를 확인하게 되면 (유일한) 클라이언트 ID를 서버 자체적으로 부여함
-
클라이언트 ID에는 각각의 Sesstion 객체(접속 시간, 횟수 등등)를 가지고 있음.
-
클라이언트가 서버를 끄게 되면(연결이 끊기게 되면) 클라이언트 ID는 삭제됨
-
사용자의 정보 중 보안상 중요한 데이터는 Sesstion에서 관리함
: 클라이언트 측에 저장(쿠키)하게 되면 보안상 취약해질 수 있기 때문
cookie
: 서버가 사용자의 위치(브라우저)에 정보를 저장하고 불러올 수 있는 수단
: 사용자의 정보를 사용자 메모리(브라우저)에서 관리함.
toke
: 인증을 위해 사용되는 암호화 된 문자열
-
보통 cookie에 담겨서 전달되는 것 같음.
-
HTTP 통신의 Stateless 특징을 보완하기 위한 방법.
- 서버가 끊기고 다시 클라이언트가 들어오게 되면 이전의 데이터는 서버는 알 수 없지만 token을 이용하면 state하게 응답과 요청을 진행할 수 있음. ex) 자동 로그인
- 이 토큰을 가지고 있으면 클라이언트를 빠르게 확인해서 유저의 상태를 관리할 필요가 없기 때문에 stateless하며, 이를 구현하는 것이 token임
-
유저의 인증 정보를 서버나 세션에 담아두지 않음 : token의 가장 뚜렷한 장점 같음
해당 토큰을 가지고 있으면 어떤 상황에도 특정 유저의 활성화 여부를 신경쓰지 않고 token만을 확인하면 됨.
node.js에서는 set-cookie를 통해 헤더에 쿠키를 생성한다. 쿠키값은 보통 key, value 값이다.
참고 : nodejs.org/dist/latest-v12.x/docs/api/http.html#http_response_getheader_name
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
클라이언트 측에서 이렇게 서버로 요청을 보내면, 서버에서는
<로그인>
1. 세션 객체에 세션 토큰을 생성한다.
세션 객체는 일반적인 서버에, 혹은 DB 서버에 있기도하다. 특정 위치나 공간이 아닌, 서버 어딘가에 있는 저장소로 이해하면 되는 것 같다.
2. 만든 토큰을 쿠키와 함께 클라이언트 측에 보낸다.
<로그인 후>
3. 클라이언트 측에서는 이렇게 생성한 쿠키와 세션을 가지고 mypage 등 접근 권한이 필요한 곳에 가겠다는 요청을 할 수 있다.
4. 서버층에서는 토큰 여부와 정확한 토큰인지를 확인하고 요청을 승인하는 응답을 보낸다.
암호화(Encryption)
: 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하여 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 '알고리즘'을 이용해 관리하는 과정
암호화 방법
Hashing(hash string)
: 여떤 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것 ex) SHA1
- 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다
- 최대한 고유한 해시 값을 가진다
- 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다
Salt
: 해시 하려는 값(원본)에 추가하는 값
배경)
-
암호화를 진행했다면 '해당 알고리즘을 알고 있는 순간' 바로 원본을 얻어낼 수 있다.
⇒ 해싱만 사용했을 때 한계가 있음(알고리즘이 노출되는 등) 임의의 값을 추가하여 안정장치를 만듦
-
기존 : 암호화하려는 값 ⇒ hash 값
Salt 사용 : 암호화 하려는 값 + Salt용 값 ⇒ hash 값
node.js 내장 모듈 : Crypto
const crypto = require('cryto');
const secret = 'abcdefg'; //Salt값
const hash = crypto.createHmac('sha256', secret) //알고리즘 방식 선택
.update('password') //패스워드 입력
.digest('hex') //인코딩 방식
console.log(hash); //해싱된 값이 나옴
'2020년 > TIL(Today I Learn)' 카테고리의 다른 글
코드스테이츠 IM 코스를 마치며 (0) | 2020.11.10 |
---|---|
20.08.10 TIL_node.js module 사용 (0) | 2020.08.11 |
20.08.10_Async & Callback & Promise (0) | 2020.08.11 |
20.08.03 Time Complex 정리 (0) | 2020.08.11 |
20.07.28_문제 오답 노트 (0) | 2020.07.28 |