Auth/secret.js

import crypto from '../lib/CryptoJS'
import { localStorage } from '../util'
import { getAppKey as _getAppKey } from '../common'

/**
 * @function getAppKey
 * @return {String} 사용중인 App Key
 * @memberof Kakao.Auth
 */
export function getAppKey() {
  return _getAppKey()
}

let accessToken = null
/**
 * @function getAccessToken
 * @return {String} 사용 중인 액세스 토큰
 * @memberof Kakao.Auth
 */
export function getAccessToken() {
  if (accessToken === null) {
    accessToken = retrieveItem(getAccessTokenKey())
  }

  return accessToken
}

/**
 * API 호출 시 사용할 액세스 토큰을 설정합니다.
 * @function setAccessToken
 * @param {String} token 사용할 액세스 토큰
 * @param {Boolean} [persist=true] 세션이 종료된 뒤에도 액세스 토큰을 사용할 수 있도록 로컬 스토리지 저장 여부
 * @memberof Kakao.Auth
 */
export function setAccessToken(token, persist = true) {
  accessToken = token

  if (token === null || persist === false) {
    // EXPLICITLY REQUESTED NON-PERSISTANCE
    removeItem(getAccessTokenKey())
  } else {
    storeItem(getAccessTokenKey(), token)
  }
}

/**
 * @function getRefreshToken
 * @deprecated 이 API는 보안 정책으로 인해 폐기되었습니다.
 * @memberof Kakao.Auth
 */
export function getRefreshToken() {
  console.error('unsupported operation: Auth.getRefreshToken()')
  return ''
}

/**
 * @function setRefreshToken
 * @deprecated 이 API는 보안 정책으로 인해 폐기되었습니다.
 * @memberof Kakao.Auth
 */
export function setRefreshToken(token) {
  console.error('unsupported operation: Auth.setRefreshToken()')
}

function storeItem(key, value) {
  const item = encrypt(value, getAppKey())
  localStorage.setItem(key, item)
}

function retrieveItem(key) {
  const item = localStorage.getItem(key)
  return item ? decrypt(item, getAppKey()) : null
}

function removeItem(key) {
  localStorage.removeItem(key)
}

// CACHE TOKEN STORAGE KEYS
const tokenStorageKeys = {}
function getAccessTokenKey() {
  if (!tokenStorageKeys.accessTokenKey) {
    tokenStorageKeys.accessTokenKey = 'kakao_' + hash('kat' + getAppKey())
  }

  return tokenStorageKeys.accessTokenKey
}

function hash(msg) {
  return crypto.MD5(msg).toString()
}

function encrypt(msg, passphrase) {
  return crypto.AES.encrypt(msg, passphrase).toString()
}

function decrypt(encrypted, passphrase) {
  return crypto.AES.decrypt(encrypted, passphrase).toString(crypto.enc.Utf8)
}