티스토리 뷰

반응형

인증과 인가

  인증은 유저가 누구인지 확인하는 것이다. 로그인을 통해서 사용자가 누구인지 알 수 있다.

  인가는 유저가 사용 가능한 자원을 정의하는 것이다. 로그인을 한 후 사용자는 이메일을 사용할 수 있다.

 

기본적인 인증

  기본 인증은 다음과 같은 두 가지 절차를 거친다.

  1. 아이디와 비밀번호를 인코딩하여 서버에 전송한다

  2. 서버는 아이디와 비밀번호를 디코딩한 후, 사용자 정보가 저장된 데이터 베이스 혹은 인증 서버에서 아이디와 비밀번호를 비교한다.

 

  위의 절차는 문제가 있다.

  첫 번째로 디코더가 있다면 중간자 공격(MITM)을 통해 아이디와 비밀번호를 확인할 수 있어, 아이디와 비밀번호가 유출될 수 있다. HTTP 프로토콜을 사용할 수 없고, HTTPS를 사용해야 한다.

  두 번째로 인증 서버와 인증 DB에 과부하가 걸릴 수 있다. 서비스 마다 인증 서버에 요청을 하게 된다면, 요청 서버에 과부하가 걸릴 수 있다. 이런 인증 서버가 Single Point of Failure이 된다.

Single Point of Failure
시스템 구성 요소 중에서, 동작하지 않으면 전체 시스템이 중단되는 요소

 

토큰 기반 인증

  Token은 사용자를 구분할 수 있는 문자열이다. 이는 다음과 같은 절차를 거친다.

  1. 최초 로그인 시 서버가 토큰을 만들어 클라이언트에 반환한다

  2. 클라이언트는 아이디와 비밀번호 대신 토큰을 넘긴다

  3. 토큰을 헤더에 넣어서 사용자는 인증된 것을 알린다

 

  최초 로그인을 제외하고 아이디와 비밀번호를 넘길 필요가 없기 때문에 앞에서 언급한 기본 인증보다는 안전하다. 그리고 서버가 토큰을 생성하기 때문에 정보 혹은 유효 시간을 직접 관리할 수 있다. 또 다른 장점으로는 디바이스마다 다른 토큰을 부여할 수 있기 때문에 디바이스마다 로그인, 로그아웃이 가능하다.

 

  하지만 그렇더라도 토큰마다 유효성을 검증해야 하기 때문에 인증 서버와 인증 DB에 대한 과부하 문제는 남아 있다.

 

JSON 웹 토큰 (JWT)

  JWT는 JSON Web Token의 약어이다. JWT는 개방형 표준(open standard)로써 전자 서명된 토큰을 사용하는 것이다. JSON 형태의 토큰이고 {header}.{pyload}.signature 형태로 구성되어 있고 서버가 생성한다.

 

header & payload & signature 구성

header

  • typ: type. 토큰의 타입.
  • alg: Algorithm. 토큰의 서명을 발행하는데 사용된 해시 알고리즘

 

payload

  • sub: subject. id처럼 유일한 식별자.
  • iss: issuer. 토큰을 발행한 주체.
  • iat: issued at. 토큰이 발생된 날짜와 시간.
  • exp: expiration. 토큰이 만료되는 시간.

 

signature

  • 토큰을 발행한 issuer이 발생한 서명
  • 토큰의 유효성 검사에 사용

 

JWT 인증 절차

  1. {헤더}. {페이로드} 작성

  2. 1에서 작성한 {헤더}.{페이로드}와 secret 키를 사용하여 전자 서명 생성

  3. {헤더}.{페이로드}.서명을 인코딩한 뒤 클라이언트에게 반환

  4. 클라이언트는 서비스를 사용할 때 토큰 전송

  5. 클라이언트에게서 받은 토큰 디코딩

  6. {헤더}.{페이로드}를 분리하여 secret 키로 전자 서명 생성

  7. 클라이언트가 전송한 전자 서명과 6에서 생성한 전자 서명이 일치하는지 확인

 

  처음 로그인을 제외하고는 토큰의 유효성에 대해서 인증 서버에 물어볼 필요가 없다. 따라서 인증 서버에 부하를 일으키지 않는다는 장점이 있다.

  토큰을 전송할 때 누군가가 훔쳐간다면 훔쳐간 토큰으로 리소스 접근이 가능해지기 때문에 HTTPS 통신은 필수이다.

 

 

JWT 토큰 생성

  위와 같이 유저에게 전송할 DTO(UserDTO라고 하겠다)에 token을 저장할 필드를 추가한다.

 

// jwt
implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'
//spring security
implementation 'org.springframework.boot:spring-boot-starter-security'

  build.gradle 파일의 dependencies에 jjwt 라이브러리와 spring security를 추가해준다. mvnrepository.com에 가서 원하는 버전으로 가져오면 오타 없이 편하게 추가할 수 있다.

 

userID를 리턴
토큰을 생성하는 코드

  SECRET_KEY는 전자서명을 생성하는데 사용한다. create 메서드로 생성한 토큰을 클라이언트에게 전송하면 된다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함