비전공자 코딩 배우기 _19주차 세션기반 인증, 토큰기반 인증

Jinny·2021년 9월 18일
0

TIL

목록 보기
16/28
post-thumbnail

세션기반 인증 (Session-based Authentication)

세션(Session)

  • 서버가 Client에 유일하고 암호화된 ID를 부여
  • 쿠키는 서버에서 발급한 Session ID를 저장하고, 그것을 사용해서 어떤 사용자가 서버에 로그인 되어있음이 지속되는 상태
  • 중요 데이터는 서버에서 관리

서버와 클라이언트에 필요한 것은

  1. 서버는 사용자가 인증에 성공했음을 알고있어야 한다.
  2. 클라이언트는 인증 성공을 증명할 수단을 갖고있어야 한다.

인증(Authentication)

사용자가 자기 계정을 사용하려고 할 때 아이디와 비밀번호가 맞는지 인증이 되면 로그인이 된다.

인가(Authorization)

인증을 받은 사용자가 서비스 안에서 돌아다닐 때 서버가 로그인을 한 사용자라는걸 알아보고 허가해준다.

로그아웃

세션 아이디가 담긴 쿠키는 클라이언트에 저장되어 있으며, 서버는 세션을 저장하고 있다.

서버는 그저 세션 아이디로만 요청을 판단한다.

로그아웃은 두 가지 작업을 해야 한다.

  1. 서버의 세션 정보를 삭제한다.
  2. 클라이언트의 쿠키를 갱신해야 한다.

서버가 클라이언트의 쿠키를 임의로 삭제할 순 없지만, set-cookie로 세션 아이디의 키 값을 무효한 값으로 갱신한다.


토큰기반 인증 (Token-based Authentication)

토큰방식(JSON Web Token)

토큰은 유저 정보를 암호화한 상태로 담을 수 있고, 암호화했기 때문에 클라이언트에 담을 수 있다.

JWT의 종류

Access Token

  • 보호된 정보들(유저의 이메일, 연락처 사진 등)에 접근할 수 있는 권한부여에 사용한다.
  • 클라이언트가 처음 인증을 받게될 때(로그인 시) access, refresh token을 두 가지 받는다.
  • 실제로 권한을 얻는 데 사용하는 토큰이다.

Refresh Token

  • Access token의 유효기간이 만료된다면 refresh token을 사용하여 새로운 access token을 발급받는다.
  • 유저는 다시 로그인할 필요가 없다.

JWT 구조

인코딩 또는 암호화된 3가지 데이터 이어 붙인다.

  1. 헤더

    토큰의 타입이 JWT로 고정되어 있고, HS256 등 여러 암호화 방식 중 하나를 지정할 수 있다.

    // JSON형태
    {
      "alg": "HS256",
      "typ": "JWT"
    }
  2. 페이로드

    Base64로 인코딩해보면 JSON형식으로 여러 정보들이 있다.

    이 토큰을 누가 누구에게 발급했는지, 이 토큰이 언제까지 유효한지 그리고 서비스가 사용자에게 이 토큰을 통해 공개하기 원하는 내용(닉네임, 서비스상의 레벨, 관리자 여부 등) 서비스 측에서 원하는대로 담을 수 있다.

    이렇게 토큰에 담긴 사용자 정보 등의 데이터를 Claim이라고 한다.

    // JSON형태
    {
      "sub": "someInformation",
      "name": "phillip",
      "iat": 151623391
    }
  3. 서명

    헤더, 페이로드, 서버에 감춰놓은 비밀 값 이 셋을 암호화 알고리즘에 넣고 돌리면 서명 값이 나온다.

    // HMAC SHA256 알고리즘을 사용 시 생성되는 서명
    HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret);

JWT의 장점

  1. Statelessness & Scalability (무상태성 & 확장성)

    • 서버는 클라이언트에 대한 정보를 저장할 필요가 없다.(토큰 해독이 되는지만 판단)
    • 클라이언트는 새로운 요청을 보낼때마다 토큰을 헤더에 포함시키면 된다.
      • 서버를 여러개 가지고 있는 서비스라면 같은 토큰으로 여러 서버에서 인증 가능하기 때문에 더 유용하다.
  2. 안전하다.

    • 암호화한 토큰을 사용하고, 암호화 키를 노출할 필요가 없기 때문에 안전하다.
  3. 어디서나 생성 가능하다.

    • 토큰을 확인하는 서버가 토큰을 만들어야 하는 법이 없다.
    • 토큰 생성용 서버를 만들거나, 다른 회사에서 토큰관련 작업을 맡기는 방법도 가능하다.
  4. 권한 부여에 용이하다.

    • 토큰의 페이로드안에 어떤 정보에 접근 가능한지 정할 수 있다.
      • ex) 서비스의 사진과 연락처 사용권한만 부여

출처 :
유튜브 (https://www.youtube.com/watch?v=1QiOXWEbqYQ)
구글 검색
(https://ssungkang.tistory.com/entry/WEB-Authentication-1-%EC%84%B8%EC%85%98%EA%B3%BC-%EC%BF%A0%ED%82%A4)
(https://velog.io/@paulkim/Session-%EA%B3%BC-%ED%86%A0%ED%81%B0%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9C%A0%EC%A0%80-%EC%9D%B8%EC%A6%9D%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C)

profile
코린이

0개의 댓글